我想知道将倒数计时器添加到QMessageBox
的最佳方法是什么?例如,当显示消息框时,倒数计时器开始说5秒钟。如果用户没有响应消息框,则消息框将选择默认选项。
答案 0 :(得分: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);
答案 1 :(得分:1)
如果您不需要显示超时,请将QTimer::singleShot
与close()
,accept()
或reject()
个插槽一起使用。如果您需要,则将QMessageBox
或QDialog
子类化,并根据需要重新实现方法,例如:重新实现QObject::timerEvent
以进行文本更新。
答案 2 :(得分:0)
如果您希望消息框显示计时器值,我认为您最好自己制作QDialog
子类。否则听起来很简单 - 用show
显示您的消息,启动计时器,连接到timeout
插槽并操纵对话框。