簡體   English   中英

Qt5跨線程信號和插槽

[英]Qt5 cross-threads signal and slot

在關閉該問題之前,請重復進行以下操作:關於此問題的問題來自2009年,Qt更改了應如何實施線程。

我的Qt應用程序有一個主線程和一個工作線程。 我簡化了該問題的代碼,但問題如下:

如果MainWindow對象發出一個信號,則該信號必須由另一個QThread中的worker對象的插槽接收。

主要功能如下:

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

(簡化的)worker類如下所示:

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函數,但不會執行worker對象中的插槽。

發現問題, Worker::process確實阻塞了事件循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM