QMessageBox с таймером обратного отсчета

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

3

Решение

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

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

Другие решения

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

1

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

0
По вопросам рекламы [email protected]