Qt, wątki Gdzie jest mój SIGNAL?

0

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: 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);
    }
}

1

Czy twój plik mythred.h jest wyminimy w pliku projektu *.pro?
Powinno być coś takiego:

HEADERS += mythred.h

Czy po zbudowaniu został wygenerowany plik 'mythred_moc.cpp' lub coś podobnego? (to jest niezbędne by sygnały i sloty działały).

1

Czy klasa QThread posiada sygnał numberChanged(int) ? Wydaje mi się że wybrałeś złe źródło sygnału.

1

O bezpośrednim problemie już napisali panowie powyżej, ale to wszystko byłoby błędem kompilacji gdybyś użył "nowej" (ahem, 5 lat) składni connect:

connect(mThred, &MyThred::numberChanged, this, &Dialog::onNumberChanged));
0
MarekR22 napisał(a):

Czy twój plik mythred.h jest wyminimy w pliku projektu *.pro?
Powinno być coś takiego:

HEADERS += mythred.h

Czy po zbudowaniu został wygenerowany plik 'mythred_moc.cpp' lub coś podobnego? (to jest niezbędne by sygnały i sloty działały).

mythred.h jest dodany w pliku .pro, zestał wygenerowany moc_mythred.cpp

Wielki Rycerz napisał(a):

Czy klasa QThread posiada sygnał numberChanged(int) ? Wydaje mi się że wybrałeś złe źródło sygnału.

Sygnał numberChanged(int) należy do klasy MyThred. QThread jest klasą standardową, nic tam nie zmieniałem, więc pewnie nie ma tam sygnału numberChanged.

0
kq napisał(a):

O bezpośrednim problemie już napisali panowie powyżej, ale to wszystko byłoby błędem kompilacji gdybyś użył "nowej" (ahem, 5 lat) składni connect:

connect(mThred, &MyThred::numberChanged, this, &Dialog::onNumberChanged));

Działa, dzięki :)

1

Nie rozumiesz mnie. Żeby sygnały i sloty działały prawidłowo, moc-tool musi wygenerować dodatkowy plik ze źródłami.
Każdy twój plik, który zawiera makro Q_OBJECT albo Q_GADGET musi być wymieniony w HEADERS żeby system budowania wiedział, że ma go przepuścić przez moc-tool, który tworzy dodatkowy plik źródłowy z meta danymi. Te meta dane miedzy innymi zawierają informację o sygnałach i slotach zdefiniowanych w danej klasie. Jeśli tych danych brakuje connect się wyłoży dokładnie z takim błędem jaki podałeś.

Swoją drogą strasznie źle nazwałeś tę swoją klasę MyThred i zapewne z tego powodu nie zrozumiałeś odpowiedzi. To nie jest wątek, to jest coś co wykonuje jakąś czynność (np CrazySynchronousCounter).
Z tego powodu źle nazwanie zmienne i źle łączyłeś sygnały. I my też mieliśmy problemy z wypatrzenie tego prostego babola.

1 użytkowników online, w tym zalogowanych: 0, gości: 1