在Qt等待按下按钮

时间:2011-08-19 00:45:50

标签: c++ multithreading qt qt4 signals-slots

我有一个继承自QDialog的自定义类。我正在使用函数foo创建此对话框,并且foo只有在按下对话框中的某个按钮时才会继续执行其操作。我在考虑使用信号和插槽,但是我怎样才能让foo响应来自另一个线程的信号?

编辑:基本上我想知道如何使用我自己的对话框重新实现QInputDialog :: getText()的功能。

2 个答案:

答案 0 :(得分:3)

您的foo()函数可以在[QWaitCondition] [1]对象上调用wait(),然后您的按钮可以在同一个对象上调用wakeOne()以使wait()返回。

也就是说,实际上没有必要使用多线程来重新实现QInputDialog :: getText()。您应该能够在单个线程中重新实现该功能而不会出现任何问题,并且这样做会更加简单和可靠。

(注意:假设你想要你的getText()版本阻止,直到按下一个按钮后才返回,你需要调用QDialog :: exec()。我不推荐这种编程风格,因为它容易出错...例如,如果用户在QInputDialog仍处于打开状态时关闭QInputDialog的父窗口会发生什么?这会删除QEputDialog对象,该对象的getText()方法程序仍被阻止,可能导致崩溃因为QInputDialog的“this”指针现在是一个悬空指针。它更干净,更安全,使所有事件都基于事件(即仅信号和槽),而不是试图阻止或递归你自己的代码中的Qt事件循环)

答案 1 :(得分:1)

http://doc.qt.io/qt-4.8/qdialog.html#modal-dialogs

模态对话框将阻止用户与其他窗口交互,这听起来就像你需要的那样。另外,我认为你想调用exec()而不是show()。 Show()立即将执行返回给调用者,其中exec()阻塞。