【问题标题】:how to run qt main window in loop avoid Qt app.exec() blocking main thread如何在循环中运行 qt 主窗口避免 Qt app.exec() 阻塞主线程
【发布时间】:2022-01-24 06:21:33
【问题描述】:

我是 Qt 新手,但需要解决一个难题。

需要循环运行 qt 主窗口,其中 app.exec() 将阻塞 main 函数,直到收到退出。 但我想根据收到的事件循环显示和隐藏主窗口以隐藏和显示主窗口

这里是示例代码,现在我正在使用示例:

void main(int argc, char **argv)
{
  //QT window init
  w.setVisible(true);
  app.exec();
}

可以调用qt窗口的time init并在循环中隐藏和显示吗?

我需要添加while循环,基于事件隐藏或显示主窗口将显示和隐藏

void main(int argc, char **argv)
{
  //QT window init
  w.setVisible(true);
  app.exec();
  while(1)
 {
  //if show status received 
    if(show)
     w.setVisible(true);
  // if hide window status received 
   else if(hide)
     w.setVisible(false);
 }
}

如何让 app.exe 一直处于活动状态以实现窗口的隐藏/显示? 还有其他 QT api 调用吗?

i have gone through this link

【问题讨论】:

  • 为什么不在 QT 的事件循环中接收这些事件(或将它们转发到那里)并使用一些 QT 特定的机制(例如信号槽连接)来触发窗口上的操作?你在这里特别问的似乎不仅困难(如果根本不可能的话)而且还建议XY problem
  • 无论设置这些showhide 变量的代码都可以向您的主窗口发送信号。
  • 感谢快速重播@Botje 我怎样才能连续循环发出信号?因为我们无法预测隐藏或显示事件,我需要使用线程吗?
  • 在不知道您的意图的情况下很难回答,但是您不能使用重复的 QTimer 每 x 秒发出一个事件信号吗?如果不是,什么进程决定是隐藏还是显示窗口?
  • 来自 https 请求或可能来自用户通过 gui ,那么我如何在循环中显示/隐藏窗口?有什么建议可以在循环中隐藏和显示主窗口吗? stackoverflow.com/questions/5129788/… 或 QT 中的任何其他 API,然后是 app.exec

标签: c++ linux qt


【解决方案1】:

对于这种情况,Qt 推荐的解决方案是添加一个 QTimer 并将超时设置为零,这将保证您的回调在每个循环中都被调用。

要让您的应用程序执行空闲处理,即在没有未决事件时执行特殊功能,请使用具有 0 超时的 QTimer。使用 processEvents() 可以实现更高级的空闲处理方案。

https://doc.qt.io/qt-5/qapplication.html#exec

您可以大胆地继承 QApplication 并复制/粘贴 exec() 的源代码,但我强烈建议您不要这样做,因为其中的准备和清理代码可能会在任何新版本中发生变化。

【讨论】:

  • 感谢@Jellyboy 的建议,我们如何在上述场景中使用任何示例,
  • 只需使用timer->start(0)doc.qt.io/qt-5/…将超时设置为零
  • QEventLoop 事件循环; QTimer::singleShot(msec, &eventLoop, SLOT(hide())); eventLoop.exec();我可以将上面的 sn-ps 用于 eventloop 吗?
  • 我是 QT 的新手,C++ 将 qt eventloop 解决我的问题吗?隐藏后再次显示窗口,我需要再次重新初始化窗口吗?比如调用 QApplication app(argc, argv);一次初始化就够了吗?
  • Qt 事件循环在QApplication::exec() 内。你需要调用它。
猜你喜欢
  • 2014-04-12
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多