2

我试图在以下情况下避免竞争条件:

QDialog* dialog = [...];
QThread* thread = [...];

connect(thread, SIGNAL(finished()), dialog, SLOT(accept()));

thread->start();
dialog->exec();

当线程在 QDialog::exec() 设置对话框之前完成时,由信号触发的“accept()”调用将丢失,对话框不会自行关闭...

所以理想情况下,我只想在对话框准备好处理它之后才启动线程,但我该怎么做呢?

4

2 回答 2

3

诀窍是只有在已经显示对话框时才必须启动线程。因此,一旦引发 QDialog 的 showEvent ,您就必须启动它。
首先,您必须捕获 showEvent,您可以通过使用QObject::installEventFilterandQObject::eventFilter或通过子类化QDialogoverriding来做到这一点QWidget::showEvent
完成此操作后,您希望发出线程开始的信号。您需要一个自定义信号,根据您选择捕获显示事件的方式YourClass::eventFilter或以何种方式发出该信号。 现在只需将该信号连接到插槽,您就应该完成(编辑:使用 a )。 确保您不要两次处理信号!YourClass::showEvent
QThread::start()Qt::QueuedConnection

QDialog::accepted()

于 2011-01-27T14:05:27.167 回答
0

自从我使用 Qt 以来已经有一段时间了。但是你为什么要使用 QThread 来处理对话框中的 Accept 点击呢?如果它是模态对话框,则可以使用 QDialog::r​​esult(),或者您可以将信号从线程转发到 QDialog::accepted()...

于 2011-01-27T13:43:50.063 回答