QT(C++)自学日记(长期更新)

起点是为了补充 Linux 下的一些轮子,而且公司有个简单的服务器 GUI 管理系统要做,所以就自学了下,反正多学点总是好的。

# QStringList 类常用方法总结

QList<QString> 继承而来,它提供快速索引为基础的接入以及快速插入和清除 其成员函数用于操作这个字符串列表如 append(),insert(), replace(), removeAll(), removeAt(), removeFirst(), removeLast(), and removeOne()

# 增加字符串

可以通过 append() ,或使用 <<,如

QStringList fonts;
fonts << "Arial" << "Helvetica" << "Times" << "Courier";
// fonts:[ "Arial" ,"Helvetica", "Times" , "Courier"]
1
2
3

# 合并字符串使用 join( )

QString str = fonts.join(",");
// str == "Arial,Helvetica,Times,Courier"
1
2

# 拆分字符串

QString str = " Arial,Helvetica, ,Times,Courier ";
QStringList list1 = str.split(",");
// list1: [ " Arial ", " Helvetica ",” “, " Times ", " Courier " ]
1
2
3
QStringList list2 = str.split(",", QString::SkipEmptyParts);
// list2: [ " Arial ", " Helvetica ", " Times ", " Courier " ]
1
2

也就是说如果有 QString::SkipEmptyParts,空项不会出现在结果。默认情况下,空项被保留

# 索引

IndexOf() 函数返回给定字符串的第一个出现的索引。 而 lastIndexOf() 函数,返回字符串的最后一次出现的索引。

# 替换 replaceInStrings()

QStringList files;
files << "$QTDIR/src/moc/moc.y"
<< "$QTDIR/src/moc/moc.l"
<< "$QTDIR/include/qconfig.h";
files.replaceInStrings("$QTDIR", "/usr/lib/qt");
// files: [ "/usr/lib/qt/src/moc/moc.y", ...]
1
2
3
4
5
6

# 过滤 filter()

可以让你提取一个新的列表只包含这些字符串包含一个特定的字符串(或匹配特定正则表达式):

QStringList list;
list << "Bill Murray" << "John Doe" << "Bill Clinton";
QStringList result;
result = list.filter("Bill");
// result: ["Bill Murray", "Bill Clinton"]
1
2
3
4
5

# 遍历

for (QList<QString>::Iterator it = files.begin(); it != files.end(); it++){
    ui->listWidget->addItem(new QListWidgetItem(QString(*it)));
}
1
2
3

# 利用 QRegExp 移除字符串中所有空格

QString QStringUtil::removeAllSpaces(QString str) {
    return str.remove(QRegExp("\\s"));
}
1
2
3

# QInputDialog 的使用

bool ok;
QString text = QInputDialog::getText(this, "对话框", "请输入文件名" , QLineEdit::Normal, "", &ok);
if (ok) {
    qDebug() << text;
}
1
2
3
4
5

参数 QWidget *parent:熟悉的父组件的指针; 参数 const QString &title:对话框的标题; 参数 const QString &label:在输入框上面的提示语句; 参数 QLineEdit::EchoMode echo:指明这个 QLineEdit 的输入模式,取值范围是QLineEdit::EchoMode,默认是 Normal,也就是正常显示,你也可以声明为 Password,这样就是密码的输入显示了,具体请查阅 API; 参数 const QString &text:QLineEdit 的默认字符串; 参数 bool *ok:ok 是可选的,如果非 NULL,则当用户按下对话框的 OK 按钮时,这个 bool 变量会被置为 true,可以由这个去判断用户是按下的 OK 还是 Cancel,从而获知这个 text 是不是有意义; 参数 Qt::WindowFlags flags:flags 用于指定对话框的样式。 虽然参数很多,但是每个参数的含义都比较明显,大家只要参照 API 就可以知道了。 函数的返回值是 QString,也就是用户在 QLineEdit 里面输入的内容。至于这个内容有没有意义,那就要看那个 ok 参数是不是 true 了。

# 利用 QProcess 调用系统命令

例如 Linux 下调用赋予文件执行权限:

QProcess *cmd = new QProcess;
cmd->start("chmod +x " + basePath + fileName); // 赋予执行权限
cmd->waitForFinished();
delete cmd;
1
2
3
4
QString CmdUtil::runCmd(QString cmdStr, int timeout) {
    QProcess cmd;
    cmd.start("cmd.exe", QStringList()<<"/c"<<cmdStr);
    if (cmd.waitForStarted()) {
        cmd.waitForFinished(timeout);
        QString strTemp = QString::fromLocal8Bit(cmd.readAllStandardOutput());
        return strTemp;
    } else {
        qDebug() << "cmd error";
        return QString("");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# QTimer 运行定时器线程

头文件定义如下

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    static int tomcatPort;
    static int mysqlPort;
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    void initConfig(QFile &config);
private slots:
    void onTomcatCheckReceive(bool flag);
    void onMysqlCheckReceive(bool flag);
    void onLogRead(QString str);
    void on_tomcatStart_clicked();
    void on_tomcatStop_clicked();
    void on_mysqlStart_clicked();
    void on_mysqlStop_clicked();
};

#endif // MAINWINDOW_H

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

源码文件:

QTimer timer;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
        // 无关代码略
        QObject::connect(&timer, SIGNAL(timeout()), &tomcatCheckWorker, SLOT(onTimeout()));
        QObject::connect(&tomcatCheckWorker, SIGNAL(finish(bool)), this, SLOT(onTomcatCheckReceive(bool)));
        timer.start(500);
}
1
2
3
4
5
6
7
8
9
10

# QT 中的线程 QThread

这里只记录 QT5 中推荐的方式:

#include <QtCore>
class Worker : public QObject
{
    Q_OBJECT
private slots:
    void onTimeout()
    {
        qDebug()<<"Worker::onTimeout get called from?: "<<QThread::currentThreadId();
    }
};
#include "main.moc"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"From main thread: "<<QThread::currentThreadId();

    QThread t;
    QTimer timer;
    Worker worker;

    QObject::connect(&timer, SIGNAL(timeout()), &worker, SLOT(onTimeout()));
    timer.start(1000);

    worker.moveToThread(&t);

    t.start();

    return a.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29