将 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)的主要内容,如果未能解决你的问题,请参考以下文章

Java Thread系列Master-Worker模式

Nginx 启动原理与模型

C++11 的 std::thread 是不是与 POSIX 信号量兼容?

UI Thread 和运行 TCP Client 的 Worker 线程之间的持续数据传输

iCarousel 应用程序抛出 Thread1:信号 SIGBRT

nginx的惊群问题