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



当程序第一次启动时,有时需要更新组件。更新任务应该自动进行,不需要任何用户交互。

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

我尝试使用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:

  1. 子类QWidget(让我们将其命名为MyWidget)并添加任何小部件你需要像孩子一样去做
  2. 为MyWidget添加必要的插槽,它从外部获取信息(更新进度条、文本标签等)
  3. 创建另一个类(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();

相关内容

  • 没有找到相关文章

最新更新