在此问题作为重复关闭之前:有关此问题的问题来自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();
}
(简化的)工作者类如下所示:
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对象中的插槽。
答案 0 :(得分:0)
发现问题,Worker::process
确实阻塞了事件循环。