2013-09-08 2 views
3

Я хотел знать, какой был бы лучший способ добавления таймера обратного отсчета к QMessageBox? Например, когда отображается окно сообщения, таймер обратного отсчета начинается с 5 секунд. Если пользователь не отвечает на поле «Сообщение», окно сообщения выбирает выбор по умолчанию.QMessageBox с таймером обратного отсчета

ответ

0

Если вы хотите, чтобы окно сообщения отображало значение таймера, я думаю, вам лучше сделать свой собственный подкласс QDialog. В противном случае это звучит просто - отобразите ваше сообщение с show, запустите таймер, подключитесь к слоту timeout и манипулируйте своим диалогом.

1

Используйте QTimer::singleShot с close(), accept() или reject() слотами, если вам не нужно отображать таймаут. Если вам нужно, то подкласс QMessageBox или QDialog и методы переопределения, как вы хотите, чтобы они были, например. reimplement QObject::timerEvent, чтобы сделать обновление текста.

5

Как о чем-то вроде этого:

#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);