在没有用户交互的情况下启动窗口、处理数据并关闭它?
Posted
技术标签:
【中文标题】在没有用户交互的情况下启动窗口、处理数据并关闭它?【英文标题】:Launch window, process data, and close it without user interaction? 【发布时间】:2013-02-20 00:15:15 【问题描述】:程序首次启动时,有时需要更新组件。更新任务应该自动发生,无需任何用户交互。
我想显示一个简单的窗口来显示进度。完成后,窗口将关闭并启动主窗口。
我尝试使用QDialog
,并将昂贵的代码放在init函数中,但当然它只是挡住了窗口,直到它完成后才显示出来。
exec()
运行时没有发送信号,所以我不能在执行 GUI 窗口后就开始处理。
QProgressDialog
可能在这里工作,但我实际上想放多个进度条。
有什么想法吗?
【问题讨论】:
你可以使用 QProgressDialog 吗? 也许,尽管它有更多限制(我想要的不仅仅是一个进度条)。我想知道如何处理这种情况。 【参考方案1】:有几个方法。其中之一是在 QDialog 事件循环开始后使用 QTimer 对您的进程进行排队:
QTimer::singleShot(0, this, SLOT(performUpdate());
dlg.exec();
Qt 文档中的重要内容:
一个超时间隔为 0 的 QTimer 将在窗口系统的事件队列中的所有事件都处理完后立即超时。
那么这里会发生什么?我们正在安排插槽performUpdate()
在控制返回到事件循环后立即执行。调用 dlg.exec()
时,您正在启动新的事件循环。因此,您的对话框将首先显示(因为它是窗口系统事件),然后在处理完所有内容后,您的插槽将被执行。
值得一提的是,当你执行阻塞槽时,你应该不时调用 QApplication::processEvents() 来更新 ui。
【讨论】:
【参考方案2】:在这种情况下,您可以使用任何窗口。让我们使用 QWidget:
-
子类 QWidget(让我们将其命名为 MyWidget)并添加任何小部件
作为孩子,你需要它。
向 MyWidget 添加必要的插槽,从外部获取信息(更新进度条、文本标签等)
创建另一个类(计算器)来进行计算(或您需要做的任何事情),并向其添加必要的信号(您之前声明的插槽对)和退出信号
然后在你的 main 中执行以下操作:
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();
【讨论】:
以上是关于在没有用户交互的情况下启动窗口、处理数据并关闭它?的主要内容,如果未能解决你的问题,请参考以下文章