Qt常见的线程启用方式有两种,一是继承QThread类,并实现run方法;另一种则是使用QObject::moveToThread
Example
//worker class: 新建一个Qt类,并定义一个槽函数,这个槽函数将来将运行在QThread所起的线程中
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr);
public slots:
void run();
};
void Worker::run()
{
qDebug() << "this is a test";
}
//mainwindow class
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pWork = new Worker;
m_pThread = new QThread;
m_pWork->moveToThread(m_pThread);//使用moveToThread方法,将worker类与QThread联系起来
connect(m_pThread,SIGNAL(started()), m_pWork,SLOT(run()));//线程启动后立即运行run方法
connect(m_pThread, &QThread::finished, m_pWork, &QObject::deleteLater);//线程运行结束后,释放worker类
}
void MainWindow::on_pushButton_clicked()
{
m_pThread->start();
}
注意
- 通过
QThread::currentThreadId()
打印线程id可以发现,Worker类中的构造函数与MainWindow的构造函数在同一线程中,而Worker类中的run方法则运行在其他线程中 - 只要是继承于
QObject
的类,都需要定义和实现explicit Worker(QObject *parent = nullptr)
构造函数,否则会报编译错误