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

时间:2013-02-20 00:15:15

标签: qt qdialog qprogressbar

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

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

我尝试使用QDialog,并将代价高昂的代码放在init函数中,但当然它只是阻止了窗口,直到它已经完成才显示。

exec()运行时没有发送信号,因此我不能在执行GUI窗口后立即开始处理。

QProgressDialog可以在这里工作,但我真的想在那里放置多个进度条。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

Qt docs的重要事项:

  

一旦处理了窗口系统事件队列中的所有事件,超时间隔为0的QTimer将超时。

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

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

答案 1 :(得分:1)

您可以在此方案中使用任何窗口。让我们使用QWidget:

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

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