以下代码在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
答案 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")();
}
};
如果这不是您所描述的效果的原因,则必须提供更多信息。