程序首次启动时,有时需要更新组件。更新任务应该自动发生,无需任何用户交互。
我想显示一个简单的窗口来显示进度。完成后,窗口将关闭并启动主窗口。
我尝试使用 a QDialog
,并将代价高昂的代码放在 init 函数中,但当然它只是挡住了窗口,直到它完成后才显示出来。
运行时没有发送信号exec()
,所以我不能在执行 GUI 窗口后就开始处理事情。
QProgressDialog
可能在这里工作,但我实际上想放不止一个进度条。
有任何想法吗?
程序首次启动时,有时需要更新组件。更新任务应该自动发生,无需任何用户交互。
我想显示一个简单的窗口来显示进度。完成后,窗口将关闭并启动主窗口。
我尝试使用 a QDialog
,并将代价高昂的代码放在 init 函数中,但当然它只是挡住了窗口,直到它完成后才显示出来。
运行时没有发送信号exec()
,所以我不能在执行 GUI 窗口后就开始处理事情。
QProgressDialog
可能在这里工作,但我实际上想放不止一个进度条。
有任何想法吗?
有几个方法。其中之一是在 QDialog 事件循环开始后立即使用 QTimer 对您的进程进行排队:
QTimer::singleShot(0, this, SLOT(performUpdate());
dlg.exec();
Qt 文档中的重要内容:
一个超时间隔为 0 的 QTimer 将在窗口系统的事件队列中的所有事件都被处理后立即超时。
那么这里会发生什么?performUpdate()
一旦控制回到事件循环,我们就会安排槽位执行。调用时dlg.exec()
,您正在启动新的事件循环。因此,您的对话框将首先显示(因为它是窗口系统事件),然后在处理完所有内容后,您的插槽将被执行。
值得一提的是,当你执行阻塞槽时,你应该不时调用 QApplication::processEvents() 来更新 ui。
在这种情况下,您可以使用任何窗口。让我们使用 QWidget:
然后只需在您的主要内容中执行以下操作:
QApplication app(...);
QThread thread;
MyWidget widget;
Calculator calculator;
//connect here your slots and signals, do not forget about quit signal to QWidget close() slot
calculator.moveToThread(&thread);
thread.start();
return app.exec();