Автоматическое закрытие QMessageBox - PullRequest
8 голосов
/ 10 февраля 2010

Я создаю проект Qt Symbian и хочу показать пользователю уведомление, которое должно автоматически закрыться через несколько секунд. Я видел, что Nokia часто использует это в своем интерфейсе.

Сейчас я использую приведенный ниже код, чтобы пользователь мог закрыть QMessageBox, но мне бы хотелось, чтобы была возможность автоматического закрытия QMessageBox через 1 или 2 секунды. Как я могу сделать это с помощью Qt?

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

Ответы [ 5 ]

7 голосов
/ 11 февраля 2010

Большое спасибо! Мое решение:

Я создал свой собственный класс (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);
    }
}
4 голосов
/ 10 февраля 2010

Я бы предложил подклассу QMessageBox добавить ваше собственное желаемое поведение ...

Было бы интересно добавить такие методы, как setAutoClose(bool) и setAutoCloseTimeout(int) и вызвать QTimer на showEvent, когда включена опция автозамены!

Таким образом, вы даже можете изменить внешний вид вашего QMessageBox, и у вас будет текст с надписью «Это окно автоматически закроется через XXX секунд ...» или индикатор выполнения и т. Д.

2 голосов
/ 02 декабря 2016

Вместо этого вы можете использовать Singleshot Таймер для закрытия любого диалогового окна или QLabel с большим удобством:

QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));
1 голос
/ 04 ноября 2017

С этим кодом:

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

0 голосов
/ 08 марта 2019

Это может кому-то помочь,

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

MessageBox закрывается через 5 секунд.

...