当程序第一次启动时,有时需要更新组件。更新任务应该自动进行,不需要任何用户交互。
我想显示一个简单的窗口来显示进度。完成后,窗口将关闭,主窗口将启动。
我尝试使用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:
- 子类QWidget(让我们将其命名为MyWidget)并添加任何小部件你需要像孩子一样去做
- 为MyWidget添加必要的插槽,它从外部获取信息(更新进度条、文本标签等)
- 创建另一个类(Calculator),它将进行计算(或您需要做的任何事情),并向它添加必要的信号(为您之前声明的插槽配对)和退出信号
然后只需在主菜单中执行以下操作:
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();