Qt5 пропускает сигнал и слот - PullRequest
0 голосов
/ 28 июня 2018

До того, как этот вопрос будет закрыт как дубликат: вопрос, который был задан по этой же проблеме, относится к 2009 году, и Qt изменил способ реализации потоков.

Мое приложение Qt имеет основной поток и рабочий поток. Я упростил код вопроса, но проблема в следующем:

Если объект MainWindow испускает сигнал, который должен быть получен слотом рабочего объекта в другом QThread.

Основные функции выглядят следующим образом:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv); 
    MainWindow w(0, [lot of irrelevant argumtents], ...)

    QThread* thread = new QThread;
    Worker *worker = new Worker(&w);
    QObject::connect(&w, SIGNAL(demoButtonClicked()), worker, SLOT(DemoButton()));
    QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()));
    worker->moveToThread(thread);
    thread->start();

    w.show();
    a.exec();
}

(упрощенный) рабочий класс выглядит следующим образом:

class Worker : public QObject
{
    Q_OBJECT
public:
    Worker(MainWindow *w);
public slots:
    void process();
    void DemoButton();
};


void Worker::DemoButton(){
    cout << "Slot for demo button executed from worker thread!" << endl;
}

И класс mainwindow содержит эту функцию и только сигнал, определенный в заголовке:

void MainWindow::on_pushButton_3_clicked()
{
    std::cout << "Signal for demo button emitted!" << std::endl;
    emit demoButtonClicked();
}

Когда я выполняю программу, выполняется функция on_pushButton_3_clicked, но не слот в рабочем объекте.

1 Ответ

0 голосов
/ 28 июня 2018

Обнаружил проблему, Worker::process действительно блокировал цикл событий.

...