先贴上官方文件示例:
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork(const QString ¶meter) {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Controller::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};
这是QT官方比较推荐的最新的QThread的使用示例,我错误的地方在于
class Worker : public QObject
Worker继承的父类一定要是QObject,如果父类不是QObject,那么是无效的,依旧是在一个线程里面运行。可以用它来检测你的线程是不是有效的:
qDebug() << “current thread ID:” << QThread::currentThreadId();
另外,在Worker里面,如果做出的操作会影响到GUI线程,会报错,例如初始化一个QT控件,又或者你对某个QT控件进行了操作,但是这个操作会触发一些GUI线程的的槽函数,所以建议不要在多线程里面操作QT控件。
另外,QTimer计时器是在GUI线程运行的,并不是一个单独的线程。