Cierre automático QMessageBox
-
19-09-2019 - |
Pregunta
Estoy construyendo un proyecto Symbian Qt y quiero mostrar una notificación para el usuario que debe auto cerca después de algunos segundos. He visto que Nokia utiliza mucho en esto en su interfaz de usuario.
En este momento estoy usando el código de abajo de modo que el usuario puede cerrar la QMessageBox pero me gustaría que si era posible cerrar el auto QMessageBox después de 1 o 2 segundos. ¿Cómo puedo hacer esto usando Qt?
QMessageBox msgBox;
msgBox.setText("Hello!");
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.exec();
Solución
Yo sugeriría a la subclase QMessageBox
añadir su comportamiento deseado ...
Sería interesante añadir métodos como setAutoClose(bool)
y setAutoCloseTimeout(int)
y desencadenar una QTimer
en showEvent
cuando la opción AutoClose está activado!
De esta manera, incluso se podría alterar la apparence de su QMessageBox
y tenía un texto que dice "Esta ventana se cerrará automáticamente en segundos XXX ..." o una barra de progreso, etc ...
Otros consejos
Gracias realmente mucho! Mi solución:
He creado mi propia clase (de mensaje) este es mi código para mostrarlo:
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();
Esta es mi clase:
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);
}
}
En lugar de poder utilizar Timer Singleshot
para cerrar cualquier cuadro de diálogo o QLabel
con mucha facilidad:
QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));
Con este código:
QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));
que se obtiene:
QObject::connect: Incompatible sender/receiver arguments
QTimer::timeout() --> QMessageBox::
becouse MSGBOX (el receptor) debe ser un objeto QtCore .. y QMessageBox subclases QtGui. Ver https: / /srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot
Esto puede ayudar a alguien,
msgBox.button(QMessageBox::Ok)->animateClick(5000);
El messageBox cierra después de 5 segundos.