Ошибка подключения сигнала Worker Thread к гнезду MainWindow (Qt5) - PullRequest
0 голосов
/ 13 января 2019

Я хочу написать простое приложение, которое запускает поток для выполнения некоторых вычислений. Рабочий поток должен периодически отправлять сигналы в 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));
}

1 Ответ

0 голосов
/ 13 января 2019

Хорошо, оказалось, что мне просто нужно перезапустить qmake, чтобы все заработало. Когда я впервые написал заголовочный файл worker.h, я забыл добавить макрос Q_OBJECT, который добавил позже. Тем не менее, я не запускал qmake.

...