将工作线程信号与主窗口插槽 (Qt5) 连接时出错



我想写一个简单的应用程序,它启动一个线程来做一些计算。工作线程应定期向主窗口发送信号,以通知其当前进度状态。为了实现工作线程,我子类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)'

工人.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

工人.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 类中,我有一个按钮,如果单击该按钮,该按钮应该启动线程:

主窗口.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));
}

好吧,事实证明我只需要重新运行qmake就可以让事情正常工作。当我第一次编写头文件worker.h时,我忘记添加后来添加的Q_OBJECT宏。但是,我没有跑qmake.

相关内容

  • 没有找到相关文章

最新更新