3

我想知道将倒数计时器添加到的最佳方法是QMessageBox什么?例如,当显示一个消息框时,倒数计时器会启动 5 秒。如果用户没有响应消息框,则消息框会选择一个默认选项。

4

3 回答 3

7

像这样的东西怎么样:

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

class TimedMessageBox : public QMessageBox
{
Q_OBJECT

public:       
   TimedMessageBox(int timeoutSeconds, const QString & title, const QString & text, Icon icon, int button0, int button1, int button2, QWidget * parent, WindowFlags flags = (WindowFlags)Dialog|MSWindowsFixedSizeDialogHint) 
      : QMessageBox(title, text, icon, button0, button1, button2, parent, flags)
      , _timeoutSeconds(timeoutSeconds+1)
      , _text(text)
   {
      connect(&_timer, SIGNAL(timeout()), this, SLOT(Tick()));
      _timer.setInterval(1000);
   }

   virtual void showEvent(QShowEvent * e)
   {
      QMessageBox::showEvent(e);
      Tick();
      _timer.start();
   }

private slots:
   void Tick()
   {
      if (--_timeoutSeconds >= 0) setText(_text.arg(_timeoutSeconds));
      else
      {
         _timer.stop();
         defaultButton()->animateClick();
      }
   }

private:
   QString _text;
   int _timeoutSeconds;
   QTimer _timer;
};

[...]

TimedMessageBox * tmb = new TimedMessageBox(10, tr("Timed Message Box"), tr("%1 seconds to go..."), QMessageBox::Warning, QMessageBox::Ok | QMessageBox::Default, QMessageBox::Cancel, QMessageBox::NoButton, this);
int ret = tmb->exec();
delete tmb;
printf("ret=%i\n", ret);
于 2013-09-08T18:45:10.533 回答
1

如果您不需要显示超时,请QTimer::singleShot与其中一个或插槽一起使用。如果您需要,则子类化或重新实现您希望它们成为的方法,例如重新实现以进行文本更新。close()accept()reject()QMessageBoxQDialogQObject::timerEvent

于 2013-09-08T18:37:18.300 回答
0

如果您希望消息框显示计时器值,我认为您最好制作自己的QDialog子类。否则,这听起来很简单 - 使用 显示您的消息show,启动计时器,连接到timeout插槽并操作您的对话框。

于 2013-09-08T18:28:02.863 回答