Автоматическое закрытие QMessageBox

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

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

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

4 ответов


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

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

таким образом, вы можете даже изменить видимость вашего QMessageBox и имел текст, говорящий :" это поле закроется автоматически через XXX секунд...- или индикатор прогресса и так далее...


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

Я создал свой собственный класс (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);
    }
}

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

QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));

этот код:

QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));

вы получаете:

QObject::connect: Incompatible sender/receiver arguments
        QTimer::timeout() --> QMessageBox::

Becouse msgBOx (приемник) должен быть объектом QtCore.. и qmessagebox подклассов QtGui. Смотри https://srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot