0

程序首次启动时,有时需要更新组件。更新任务应该自动发生,无需任何用户交互。

我想显示一个简单的窗口来显示进度。完成后,窗口将关闭并启动主窗口。

我尝试使用 a QDialog,并将代价高昂的代码放在 init 函数中,但当然它只是挡住了窗口,直到它完成后才显示出来。

运行时没有发送信号exec(),所以我不能在执行 GUI 窗口后就开始处理事情。

QProgressDialog可能在这里工作,但我实际上想放不止一个进度条。

有任何想法吗?

4

2 回答 2

2

有几个方法。其中之一是在 QDialog 事件循环开始后立即使用 QTimer 对您的进程进行排队:

QTimer::singleShot(0, this, SLOT(performUpdate());
dlg.exec();

Qt 文档中的重要内容:

一个超时间隔为 0 的 QTimer 将在窗口系统的事件队列中的所有事件都被处理后立即超时。

那么这里会发生什么?performUpdate()一旦控制回到事件循环,我们就会安排槽位执行。调用时dlg.exec(),您正在启动新的事件循环。因此,您的对话框将首先显示(因为它是窗口系统事件),然后在处理完所有内容后,您的插槽将被执行。

值得一提的是,当你执行阻塞槽时,你应该不时调用 QApplication::processEvents() 来更新 ui。

于 2013-02-20T11:02:00.490 回答
1

在这种情况下,您可以使用任何窗口。让我们使用 QWidget:

  1. 子类 QWidget(让我们将其命名为 MyWidget)并添加您需要的任何小部件作为子小部件。
  2. 向 MyWidget 添加必要的插槽,从外部获取信息(更新进度条、文本标签等)
  3. 创建另一个将进行计算(或您需要做的任何事情)的类(计算器),并向其添加必要的信号(您之前声明的插槽对)和退出信号

然后只需在您的主要内容中执行以下操作:

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();
于 2013-02-20T11:08:16.007 回答