【问题标题】:Qt: Is there notification when event loop starts?Qt:事件循环开始时是否有通知?
【发布时间】:2012-02-11 04:19:57
【问题描述】:

我有一个带有这种 main() 的 Qt 应用程序...

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow   mainWin;

    ... A separate, non-GUI thread is launched here

    mainWin.Init();
    mainWin.show();

    app.exec();
}

在 mainWin 之前创建的另一个线程需要知道它何时可以开始与 mainWin 通信。但是由于 mainWin 使用 Qt 信号、槽、计时器等,所以在事件循环运行(通过 exec())之前,它还没有真正准备好摇摆。

我的问题是:事件循环开始时是否会发出一些信号或事件?

考虑一下。在 mainWin.Init() 中,您可以创建类似 QTimer 的东西,甚至可以调用 .start() 来启动它。但在调用 exec() 之前,它实际上不会运行并触发事件。这就是为什么我需要知道事件循环何时真正开始。

【问题讨论】:

  • 你的线程是 Qt 线程还是原生线程?

标签: qt events signals-slots event-loop


【解决方案1】:

您可以按以下顺序进行:

QApplication app(argc, argv);
Mainwinwdow mainWin;
QThread yourThread;

//connect the signals from the thread to the mainWin here

mainWin.Init();
mainWin.show();

yourThread.start();

return app.exec();

【讨论】:

  • 仅供参考,这似乎不适用于 PyQt。在调用 app.exec_() 之前以某种方式发出和处理信号。
  • 对我来说,在使用 PyQt 的 app.exec_() 之前没有信号传递。 (2019 年 11 月)
【解决方案2】:

您可以在exec() 调用之前向您的窗口发送信号。这将在app 的信号队列中放置一个条目。 当exec() 运行时,将传递信号,您的窗口将知道事件循环正在运行。

一种简单的方法是使用QTimer::singleShot(0, &mainWin, SLOT(onEventLoopStarted()));,它连接到您的窗口类的自定义插槽。

【讨论】:

    【解决方案3】:

    由于在事件循环尚未运行时发出的信号不会丢失,因此您的线程可能不一定需要知道您的窗口何时准备就绪。
    您的线程可以立即开始向窗口发送信号,但它只会在事件循环运行时接收来自窗口的信号。

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多