【问题标题】:Closing QMessageBox on timer, setText not showing在计时器上关闭 QMessageBox,setText 不显示
【发布时间】:2015-11-02 11:25:37
【问题描述】:

以下代码会在 2 秒后关闭我的 QMessageBox。但是我的文字会在盒子关闭时显示,在盒子关闭之前它会快速闪烁。这是怎么回事?

 QMessageBox *msgBox = new QMessageBox();
 msgBox->setText("Coördinate is being created, please wait...");
 msgBox->show();
 QTimer::singleShot(2000, msgBox, SLOT(hide()));

这显示,然后在关闭之前我可以看到文本。

更新

在单线程程序中工作:方法WriteMultipleACLCommands() 占用了大量时间。也许这就是问题所在?

  QMessageBox *msgBox = new QMessageBox();
  msgBox->setText("Coördinate is being created, please wait...");
  msgBox->show();
  QTimer::singleShot(2000, msgBox, SLOT(hide()));
  singleton_SerialPortManager->WriteMultipleACLCommands();
  //function writes a few bytes onto a serial connection

【问题讨论】:

  • 我尝试了您的代码,但没有看到任何闪烁的内容。我在 Ubuntu 14.04 上使用 Qt 5.5.1。
  • 该代码看起来没有任何问题。它更有可能是其他地方的东西。

标签: c++ qt qmessagebox


【解决方案1】:

更新后

当然,如果您不立即从调用函数返回,这是一个问题 - 您正在阻塞事件循环,因此会更新所有小部件!

可能的解决方案

您可以将WriteMultipleACLCommands Q_INVOKABLE(或插槽)设为Qt::QueuedConnection

QMetaObject::invokeMethod(singleton_SerialPortManager, "WriteMultipleACLCommands", Qt::QueuedConnection);

这样您只需将事件发布到事件队列并立即返回。之后,消息框将收到更新,然后在某些时候WriteMultipleACLCommands 也会被调用。

【讨论】:

    【解决方案2】:

    您的代码很好,至少是您展示的部分。 我自己测试了它,它可以正常工作。 但请记住,关闭和隐藏对话框是两件不同的事情。 你只是隐藏窗口。该窗口仍将存在于内存中。 也许您想在计时器中调用“关闭槽”并将 windows 属性设置为“关闭时删除”:

    QMessageBox *msgBox = new QMessageBox();
    msgBox->setText("Coördinate is being created, please wait...");
    msgBox->show();
    msgBox->setAttribute(Qt::WA_DeleteOnClose);
    QTimer::singleShot(2000, msgBox, SLOT(close()));
    

    如果这不是您描述的效果的原因,您必须提供更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-01
      • 2015-01-11
      • 2014-12-25
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多