将 Worker Thread 信号与 MainWindow 插槽连接时出错(Qt5)
Posted
技术标签:
【中文标题】将 Worker Thread 信号与 MainWindow 插槽连接时出错(Qt5)【英文标题】:Error connecting Worker Thread signal with MainWindow slot (Qt5) 【发布时间】:2019-01-12 21:35:54 【问题描述】:我想编写一个简单的应用程序,它启动一个线程来进行一些计算。工作线程应定期向 MainWindow 发送信号以通知它当前的进度状态。为了实现工作线程,我继承了QThread
并重新实现了run
方法。当我使用 QTCreator 编译程序时,我总是得到这两个错误:
在Worker
的头文件中,实现了工作线程:
.../worker.h:7: error: undefined reference to `vtable for Worker'
在MainWindow
的源文件中,当我尝试将Worker
信号连接到MainWindow
插槽时:
.../worker.cpp:23: error: undefined reference to `Worker::updateLabelSig(int)'
Worker.h
#ifndef WORKER_H
#define WORKER_H
#include <QThread>
#include <vector>
class Worker : public QThread
Q_OBJECT
void run() override;
private:
void computeNumbers();
std::vector<int> foundNumbers;
int upperLimit;
signals:
void updateLabelSig(int);
;
#endif // WORKER_H
Worker.cpp
#include "worker.h"
void Worker::run()
exec();
computeNumbers();
void Worker::computeNumbers()
upperLimit=1e5;
foundNumbers.push_back(1);
for(int i=2; i<upperLimit; i++)
/////////////do some calculations and emit regular signals to inform main window///////////////////
if(i%10000==0)
emit updateLabelSig(i);
在 MainWindow 类中,我有一个按钮,如果单击它应该启动线程:
MainWindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QLabel>
#include "worker.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
MainWindow::~MainWindow()
delete ui;
void MainWindow::on_mainbutton_clicked()
Worker* w=new Worker;
QObject::connect(w,SIGNAL(Worker::updateLabelSig(int)),this,SLOT(updateLabel(int)));
w->start();
void MainWindow::updateLabel(int i)
findChild<QLabel*>("mainlabel")->setText(QString("Numbers searched so far: ")+QString::number(i));
【问题讨论】:
Qt Linker Error: "undefined reference to vtable"的可能重复 【参考方案1】:好的,结果我只需要重新运行qmake
就可以让事情正常进行。当我第一次编写头文件worker.h
时,我忘记添加我稍后添加的Q_OBJECT
宏。但是,我没有运行qmake
。
【讨论】:
以上是关于将 Worker Thread 信号与 MainWindow 插槽连接时出错(Qt5)的主要内容,如果未能解决你的问题,请参考以下文章
C++11 的 std::thread 是不是与 POSIX 信号量兼容?
UI Thread 和运行 TCP Client 的 Worker 线程之间的持续数据传输