在Qt中等待按钮按下

Waiting for button press in Qt

本文关键字:按钮 等待 Qt      更新时间:2023-10-16

我有一个自定义类继承自QDialog。我用功能foo创建这个对话框,foo想要继续做它的事情,只有当对话框中的某个按钮被按下时。我正在考虑使用信号和插槽,但是我怎么能让foo响应来自另一个线程的信号呢?

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

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

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

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

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

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