Автоматическое закрытие QMessageBox
Я создаю проект Qt Symbian и хочу показать пользователю уведомление, которое должно автоматически закрыться через несколько секунд. Я видел, что Nokia часто использует это в своем интерфейсе.
Прямо сейчас я использую приведенный ниже код, чтобы пользователь мог закрыть QMessageBox, но мне бы хотелось, чтобы была возможность автоматического закрытия QMessageBox через 1 или 2 секунды. Как я могу сделать это с помощью Qt?
QMessageBox msgBox;
msgBox.setText("Hello!");
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.exec();
6 ответов
Я бы предложил подкласс QMessageBox
добавить собственное желаемое поведение...
Было бы интересно добавить такие методы, как setAutoClose(bool)
а также setAutoCloseTimeout(int)
и вызвать QTimer
на showEvent
когда опция AutoClose включена!
Таким образом, вы можете даже изменить внешний вид вашего 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()));
Это может помочь кому-то,
msgBox.button(QMessageBox::Ok)->animateClick(5000);
MessageBox закрывается через 5 секунд.
Для Python что-то вроде
QTimer.singleShot(5000, lambda : qm.done(0))
может работать.
В приведенном ниже примере время ожидания закрытия истекает через 5 секунд, активируя опцию «Нет», если время ожидания истекло.
import sys
from PySide2.QtCore import *
from PySide2.QtWidgets import *
app = QApplication(sys.argv)
qm = QMessageBox()
qm.setText("Continue?")
qm.setStandardButtons(QMessageBox.Yes)
qm.addButton(QMessageBox.No)
qm.setDefaultButton(QMessageBox.No)
QTimer.singleShot(5000, lambda : qm.done(0))
if qm.exec_() == QMessageBox.Yes:
print("Yes!")
else:
print("No!")
С этим кодом:
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