使用QThread不使用继承
时间: 2023-09-17 21:10:07 浏览: 76
如何在QThread中使用控件
如果你想使用`QThread`类而不是继承自`QThread`的子类,你可以按照以下步骤创建一个新的线程:
1. 创建一个QObject的子类,用于执行实际的工作。让我们称之为`Worker`类。
```cpp
// worker.h
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr);
public slots:
void doWork();
};
#endif // WORKER_H
```
```cpp
// worker.cpp
#include "worker.h"
#include <QDebug>
Worker::Worker(QObject *parent) : QObject(parent)
{
}
void Worker::doWork()
{
qDebug() << "Doing work in a separate thread...";
}
```
2. 在主线程中,创建一个`QThread`对象,并将`Worker`对象移动到这个线程。
```cpp
#include <QCoreApplication>
#include <QThread>
#include "worker.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Worker worker;
QThread thread;
// 将worker对象移动到新线程中
worker.moveToThread(&thread);
// 连接线程的started信号到worker的doWork槽函数
QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork);
// 启动线程
thread.start();
// 等待线程结束
thread.wait();
return a.exec();
}
```
在上面的代码中,我们创建了一个`Worker`对象并将其移动到了一个新的线程中。然后,我们将线程的`started`信号连接到`Worker`对象的`doWork`槽函数。最后,我们启动线程并等待线程结束。
这种方法可以在不继承自`QThread`的情况下创建新线程,并且能够执行自己的工作。请注意,在这种情况下,`Worker`对象的生命周期必须保持有效,直到线程结束。
阅读全文