qt 把一个线程内的信号发送给主线程的类里面
时间: 2024-05-16 16:15:51 浏览: 16
在 Qt 中,可以通过使用 `QMetaObject::invokeMethod()` 函数将一个对象的信号发送到主线程。以下是一个示例:
```cpp
#include <QApplication>
#include <QThread>
#include <QDebug>
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {}
signals:
void progress(int value);
public slots:
void doWork()
{
for (int i = 0; i <= 100; ++i) {
emit progress(i);
QThread::msleep(50);
}
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{
m_workerThread = new QThread(this);
m_worker = new Worker();
m_worker->moveToThread(m_workerThread);
connect(m_workerThread, &QThread::started, m_worker, &Worker::doWork);
connect(m_worker, &Worker::progress, this, &MainWindow::onProgress);
m_workerThread->start();
}
~MainWindow()
{
m_workerThread->quit();
m_workerThread->wait();
}
private slots:
void onProgress(int value)
{
QMetaObject::invokeMethod(this, [this, value]() {
qDebug() << "Progress:" << value;
});
}
private:
QThread *m_workerThread;
Worker *m_worker;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
#include "main.moc"
```
在上面的示例中,`Worker` 类中的 `doWork()` 方法会在一个单独的线程中运行,并且会每隔 50 毫秒发出一个 `progress` 信号。`MainWindow` 类中的 `onProgress()` 方法会在主线程中运行,并且会将接收到的 `value` 参数打印到控制台上。请注意,`onProgress()` 方法使用了 `QMetaObject::invokeMethod()` 函数来将其调用转移到主线程中。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)