我有一个从QDialog
继承的自定义类。我正在使用功能foo
创建此对话框,并且foo
仅在按下对话框中的某个按钮时才想继续执行其操作。我当时在考虑使用信号和插槽,但是如何获得foo
来响应来自另一个线程的信号?
编辑:基本上我想知道如何使用我自己的对话框重新实现QInputDialog :: getText()的功能。
最佳答案
您的foo()函数可以在[QWaitCondition] [1]对象上调用wait(),然后您的按钮可以在同一对象上调用awanete()以使wait()返回。
就是说,实际上没有必要使用多线程重新实现QInputDialog :: getText()。您应该能够在单个线程内重新实现该功能,而不会出现任何问题,并且这样做将更加简单和可靠。
(注意:假设您要阻止getText()的版本并且直到按下按钮后才返回,则需要调用QDialog :: exec()。不过,我不建议您使用这种编程风格,因为容易出错...例如,如果用户在QInputDialog仍处于打开状态时关闭QInputDialog的父窗口会发生什么呢?这会删除QInputDialog对象,该对象的getText()方法仍被阻止在程序中,可能会导致崩溃,因为QInputDialog的“ this”指针现在是一个悬空指针,使所有内容都基于事件(例如,仅信号和插槽),而不是试图在您自己的代码中阻塞或递归Qt的事件循环,将更加干净和安全。