有没有一种方法可以在没有QApplication::exec()的情况下使用Qt
Is there a way to use Qt without QApplication::exec()?
有没有一种安全的方法可以在不调用QApplication::exec()的情况下使用Qt?
我有许多不同的对象,它们在多个资源上执行长寿命进程(其中至少有一个对象与web应用程序服务器通信)。我正在制作一个GUI应用程序,它会提示用户在正确的时间为这些不同的进程输入信息。我希望将我的"流"逻辑(决定下一步要做什么的逻辑)放在一个地方,而不是像对话框类那样放在GUI对象中。我在想我可以做这样的事情:
...
wait_dialog dlg;
dlg.setModal( false );
dlg.show(); // Should return...
netobject.start_long_lived_process_that_happens_on_other_thread( &completion_callback );
while ( !completion_callback_called() )
{
qApp->processEvents();
netobject.pump_callbacks();
magically_avoid_busywait_while_still_servicing_qt_somehow();
}
dlg.hide();
...
从Qt的角度来看,这安全吗?有没有一种"好"的方法来实现magically_avoid_busywait_while_still_servicing_qt_somehow()
?
我试图在这里完成的是以最明确的方式编写我们的处理流程。我想要一个能做到这一点的功能:
show_a_non_modal_wait_dialog()
start_some_processing_1()
wait_for_processing_1_to_finish()
dismiss_non_modal_wait_dialog()
show_modal_input_dialog()
if ( cancelled ) return
show_a_non_modal_wait_dialog()
start_some_processing_2()
wait_for_processing_2_to_finish()
dismiss_non_modal_wait_dialog()
show_modal_input_dialog()
if ( cancelled ) return
...
我真正想避免的是开始并等待Qt小部件和窗口内的处理。此外,处理对象本身完全独立于Qt。我想我要做的是在一个函数中创建一个控制器,其中包含一些助手回调和状态变量。
您想要的是应用程序主事件循环之外的事件循环。这可以使用QEventLoop
:来完成
wait_dialog dlg;
dlg.setModal( false );
dlg.show(); // Should return...
QEventLoop loop;
connect(&netobject, SIGNAL(done()), &loop, SLOT(quit()));
netobject.start_long_lived_process_that_happens_on_other_thread();
loop.exec(); // BLOCKING (non-busy) until quit() is called via the signal done()
虽然这(在我看来)是干净的代码,但这需要你的netobject类是一个QObject并实现一个信号done()
(这也比提供回调更干净)。
现在,您可以将整个代码封装在一个函数中,该函数本身就是一个阻塞调用,因此如果您愿意,它可以从您的对话框中返回一些结果
相关文章:
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- Qt/SQL - 从 QSqlQuery exec Stored Procedure 获取列类型和名称?
- 从插槽调用 QApplication::p rocessEvents 会导致再次调用同一插槽
- Python 的 exec() 函数的 C++ 版本
- 为什么使用 exec() 重新启动程序不能正常工作?
- 如何将参数包装在 C 或 C++ 中并将它们传递给系统或 exec*
- 如何在QApplication中应用QLibraryInfo中加载的库和插件配置
- 如何为应用程序中的某些按钮重置QApplication::styleSheet?
- 使用MSVC编译的Qt程序在app.exec()上崩溃
- -bash:/a.out:无法执行二进制文件:Exec格式错误
- QApplication::p rocessEvents 在不同的线程上
- 无法使用管道将数据发送到我通过exec(C++)启动的第二个应用程序
- 在运行时将更改的环境变量应用于 QApplication
- QT(4.8.2)GUI-自己的主循环,而不是qapplication :: exec()
- 有没有一种方法可以在没有QApplication::exec()的情况下使用Qt
- 在QDialog::exec()之后调用QApplication::exec.()
- 是否可以在不调用 QApplication::exec() 的情况下创建本地事件循环
- 如果使用 QApplication,qApp->exec() 是否有效
- Windows消息循环代替QApplication::exec() / QApplication::processEve
- Qt/embedded中的手动事件处理(不使用QApplication:exec())