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