0

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

 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
4

2 回答 2

1

更新后,

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

可能的解决方案

您可以制作WriteMultipleACLCommandsQ_INVOKABLE (或插槽)并将其调用为Qt::QueuedConnection

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

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

于 2015-11-02T12:20:44.713 回答
0

您的代码很好,至少是您展示的部分。我自己测试了它,它可以正常工作。但请记住,关闭和隐藏对话框是两件不同的事情。你只是隐藏窗口。该窗口仍将存在于内存中。也许您想在计时器中调用“关闭槽”并将 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()));

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

于 2015-11-02T11:42:05.437 回答