【问题标题】:Auto close QMessageBox自动关闭 QMessageBox
【发布时间】:2011-01-15 06:14:48
【问题描述】:

我正在构建一个 Qt Symbian 项目,我想向用户显示一条通知,该通知应在几秒钟后自动关闭。我已经看到诺基亚在他们的用户界面中使用了很多。

现在我正在使用下面的代码,以便用户可以关闭 QMessageBox,但我希望它可以在 1 或 2 秒后自动关闭 QMessageBox。我怎样才能使用 Qt 做到这一点?

QMessageBox msgBox;
msgBox.setText("Hello!");
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.exec();

【问题讨论】:

    标签: qt qmessagebox


    【解决方案1】:

    我建议继承 QMessageBox 以添加您自己想要的行为...

    如果启用 AutoClose 选项,添加 setAutoClose(bool)setAutoCloseTimeout(int) 之类的方法并在 showEvent 上触发 QTimer 会很有趣!

    这样,您甚至可以更改 QMessageBox 的外观并显示“此框将在 XXX 秒后自动关闭...”或进度条等文字...

    【讨论】:

      【解决方案2】:

      非常感谢!我的解决方案:

      我创建了自己的类(MessageBox),这是我展示它的代码:

      MessageBox msgBox;
      msgBox.setText("Hello!");
      msgBox.setIcon(QMessageBox::Information);
      msgBox.setStandardButtons(QMessageBox::Ok);
      msgBox.setAutoClose(true);
      msgBox.setTimeout(3); //Closes after three seconds
      msgBox.exec();
      

      这是我的课:

      class MessageBox : public QMessageBox
      
      int timeout;
      bool autoClose;
      int currentTime;
      
      void MessageBox::showEvent ( QShowEvent * event ) {
          currentTime = 0;
          if (autoClose) {
          this->startTimer(1000);
          }
      }
      
      void MessageBox::timerEvent(QTimerEvent *event)
      {
          currentTime++;
          if (currentTime>=timeout) {
          this->done(0);
          }
      }
      

      【讨论】:

      • 你对 startTimer 的定义在哪里?
      • 您也可以使用 QAbstractPushButton.animateClick 方法,只需添加msgBox.setStandardButtons(QMessageBox::Ok); msgBox.button(QMessageBox::Ok).animateClick(timeout)
      • 对象有多个定时器,你必须检查你收到的定时器事件是否真的是你期望的。其次,定时器可以一次设置为整个时间,即closeTimer.startTimer(timeout*1000),其中:QBasicTimer closeTimer。然后:void MessageBox::timerEvent(QTimerEvent *e) { if (e->timerId() == closeTimer.timerId()) done(0); }
      【解决方案3】:

      相反,您可以使用Singleshot Timer 轻松关闭任何对话框或QLabel

      QTimer *timer;
      QTimer::singleShot(10000, msgBox, SLOT(close()));
      

      【讨论】:

        【解决方案4】:

        使用此代码:

        QTimer *timer;
        QTimer::singleShot(10000, msgBox, SLOT(close()));
        

        你得到:

        QObject::connect: Incompatible sender/receiver arguments
                QTimer::timeout() --> QMessageBox::
        

        因为 msgBOx(接收器)必须是 QtCore 对象.. 并且 QMessageBox 是 QtGui 的子类。见https://srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot

        【讨论】:

          【解决方案5】:

          这可能对某人有所帮助,

          msgBox.button(QMessageBox::Ok)->animateClick(5000);
          

          消息框在 5 秒后关闭。

          【讨论】:

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