有没有一种方法可以在没有QApplication::exec()的情况下使用Qt

Is there a way to use Qt without QApplication::exec()?

本文关键字:exec QApplication Qt 情况下 一种 方法 有没有      更新时间:2023-10-16

有没有一种安全的方法可以在不调用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()(这也比提供回调更干净)。

现在,您可以将整个代码封装在一个函数中,该函数本身就是一个阻塞调用,因此如果您愿意,它可以从您的对话框中返回一些结果