Zgodnie z tym tematem za poradą @MarekR22 przeniosłem sobie obiekt do wątku.
Jednak z jakiegoś powodu connect nie widzi sygnału (po skompilowaniu i uruchomieniu w Qt Creatorze dostaję komunikat * QObject::connect: No such signal QThread::numberChanged(int) in ..\MyGuiThreadkopia\dialog.cpp:15*
Gdzie popełniłem błąd i jak go naprawić?
Moje pliki wyglądają tak:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include "mythred.h"
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
MyThred *mThread;
public slots:
void onNumberChanged(int);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QThread>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QThread *thread = new QThread(this);
MyThred *mThread = new MyThred();
mThread ->moveToThread(thread);
connect(thread, SIGNAL(numberChanged(int)), this, SLOT(onNumberChanged(int)));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::onNumberChanged(int Number){
ui->label->setText(QString::number(Number));
}
void Dialog::on_pushButton_clicked()
{
mThread->Stop = false;
thread()->start();
}
void Dialog::on_pushButton_2_clicked()
{
qDebug()<<"on_pushButton_2_clicked";
thread()->deleteLater();
mThread->Stop = true;
}
mythred.h
#ifndef MYTHRED_H
#define MYTHRED_H
#include <qobject.h>
class MyThred : public QObject
{
Q_OBJECT
public:
explicit MyThred(QObject *parent = 0);
bool Stop;
signals:
void numberChanged(int);
public slots:
void run();
};
#endif // MYTHRED_H
mythred.cpp
#include "mythred.h"
#include <QtCore>
#include <Windows.h>
MyThred::MyThred(QObject *parent) : QObject(parent)
{
}
void MyThred::run()
{
for (int i = 0; i<10000; i++){
QMutex mutex;
mutex.lock();
if (this->Stop) {qDebug()<<"Stop=true";break;}
mutex.unlock();
emit numberChanged(i);
Sleep(100);
}
}
thread
namThread
. W Twoim kodziethread
wskazuje na obiekt typuQThread
, który zgodnie z komunikatem, nie ma oczekiwanego sygnału ;)