Skip to content

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

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

QStringList 类常用方法总结

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

  • append()
  • insert()
  • replace()
  • removeAll()
  • removeAt()
  • removeFirst()
  • removeLast()
  • removeOne()

增加字符串

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

cpp
QStringList fonts;
fonts << "Arial" << "Helvetica" << "Times" << "Courier";
// fonts:[ "Arial" ,"Helvetica", "Times" , "Courier"]
QStringList fonts;
fonts << "Arial" << "Helvetica" << "Times" << "Courier";
// fonts:[ "Arial" ,"Helvetica", "Times" , "Courier"]

合并字符串使用 join( )

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

拆分字符串

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

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

索引

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

替换 replaceInStrings()

cpp
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", ...]
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", ...]

过滤 filter()

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

cpp
QStringList list;
list << "Bill Murray" << "John Doe" << "Bill Clinton";
QStringList result;
result = list.filter("Bill");
// result: ["Bill Murray", "Bill Clinton"]
QStringList list;
list << "Bill Murray" << "John Doe" << "Bill Clinton";
QStringList result;
result = list.filter("Bill");
// result: ["Bill Murray", "Bill Clinton"]

遍历

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

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

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

QInputDialog 的使用

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

参数 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 下调用赋予文件执行权限:

cpp
QProcess *cmd = new QProcess;
cmd->start("chmod +x " + basePath + fileName); // 赋予执行权限
cmd->waitForFinished();
delete cmd;
QProcess *cmd = new QProcess;
cmd->start("chmod +x " + basePath + fileName); // 赋予执行权限
cmd->waitForFinished();
delete cmd;
cpp
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("");
    }
}
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("");
    }
}

QTimer 运行定时器线程

头文件定义如下

cpp
#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
#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

源码文件:

cpp
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);
}
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);
}

QT 中的线程 QThread

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

cpp
#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();
}
#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();
}

最后编辑时间:

Version 4.0 (framework-1.0.0-rc.20)