在没有用户交互的情况下启动窗口、处理数据并关闭它?

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();

【讨论】:

以上是关于在没有用户交互的情况下启动窗口、处理数据并关闭它?的主要内容,如果未能解决你的问题,请参考以下文章

启动 Firefox 并等待它关闭

启动 Firefox 并等待它关闭

如何在窗口之间交互_以实现一个确认框为例

启动 Chrome 并等待它关闭 [重复]

启动 Safari 并等待它关闭 [重复]

在没有身份验证的情况下在 facebook 上发布(与用户交互)