C++ 满足特定条件时关闭QMessageBox

C++ 满足特定条件时关闭QMessageBox,c++,qt,qmessagebox,C++,Qt,Qmessagebox,这是有效的: #ifndef MYWARMUPMESSAGEBOX_H #define MYWARMUPMESSAGEBOX_H #include <QMessageBox> #include <QPushButton> #include <QTimer> class myWarmUpMessageBox : public QMessageBox { Q_OBJECT private: QString _text; int _tim

这是有效的:

#ifndef MYWARMUPMESSAGEBOX_H
#define MYWARMUPMESSAGEBOX_H

#include <QMessageBox>
#include <QPushButton>
#include <QTimer>

class myWarmUpMessageBox : public QMessageBox
{
    Q_OBJECT

private:

   QString _text;
   int _timeoutSeconds;
   QTimer _timer;
   int num = 0;

public:
explicit myWarmUpMessageBox(QWidget * parent):
   QMessageBox(parent)
   {
       connect(&_timer, SIGNAL(timeout()), this, SLOT(updateText()));
       _timer.start(500);
   }

   virtual void showEvent(QShowEvent * e)
   {
       QMessageBox::showEvent(e);
       updateText();
   }

public slots:

void updateText()
{
    num+=1;
    setText(QString::number(num));

    if(num>3)
        this->close();
}
QMessageBox弹出,计数为3个尿片,随后qMain窗口关闭

但是如果立即满足关闭条件,即在说

if(num>0)
    this->close();

当计时器第一次触发时,程序会制动。为什么???

您必须让QMessageBox完全打开并最大化,然后只需要关闭它,否则QMessageBox对话框可能尚未注册/完全加载,关闭功能才能成功


如果您试图访问Dialog closeevent中的任何对话框小部件属性,closeevent也是如此。

当您的消息框变为可见时,也是如此。“程序刹车”-这是什么意思?它冻结了。如果函数updateText至少被调用了两次(即计时器超时两次),那么它就不会释放Z。啊,你说得对!我想我什么都得等,直到演出结束。所以我可能会用show事件启动一个计时器,然后更新文本。
if(num>0)
    this->close();