在计时器上关闭QMessageBox,setText不显示

时间:2015-11-02 11:25:37

标签: c++ qt qmessagebox

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

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

enter image description here

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

  

更新

在单个线程程序中工作:方法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

2 个答案:

答案 0 :(得分:1)

更新后,

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

可能的解决方案

您可以WriteMultipleACLCommands Q_INVOKABLE(或广告位)并将其作为Qt::QueuedConnection调用:

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

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

答案 1 :(得分:0)

您的准则很好,至少是您展示的部分。 我自己测试了它,没有任何问题。 但请记住,关闭和隐藏对话框是两回事。 你只需隐藏窗口。窗口仍然存在于内存中。 也许您想在计时器中调用“关闭槽”并将windows属性设置为“关闭时删除”:

struct Base
{
    virtual ~Base() {}
    virtual void f() = 0;
};

struct BaseWrap : Base, python::wrapper<Base>
{
    void f()
    {
        return this->get_override("f")();
    }
};

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