程序首次启动时,有时需要更新组件。更新任务应该自动发生,无需任何用户交互。
我想展示一个显示进度的简单窗口。当它完成后,窗口将关闭,主窗口将启动。
我尝试使用QDialog
,并将代价高昂的代码放在init函数中,但当然它只是阻止了窗口,直到它已经完成才显示。
exec()
运行时没有发送信号,因此我不能在执行GUI窗口后立即开始处理。
QProgressDialog
可以在这里工作,但我真的想在那里放置多个进度条。
有什么想法吗?
答案 0 :(得分:2)
有很少的方法。其中一个是使用QTimer在QDialog事件循环开始后立即对您的进程进行排队:
QTimer::singleShot(0, this, SLOT(performUpdate());
dlg.exec();
Qt docs的重要事项:
一旦处理了窗口系统事件队列中的所有事件,超时间隔为0的QTimer将超时。
那么这里发生了什么?一旦控制回到事件循环,我们就会调度插槽performUpdate()
。在调用dlg.exec()
时,您正在启动新的事件循环。因此,您的对话框将首先显示(因为它是窗口系统事件),然后当所有内容都得到处理时,您的插槽将被执行。
值得一提的是,当你执行阻塞槽时,你应该不时调用QApplication :: processEvents()以获得更新。
答案 1 :(得分:1)
您可以在此方案中使用任何窗口。让我们使用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();