Auto à proximité QMessageBox
-
19-09-2019 - |
Question
Je construis un projet Symbian Qt et je veux montrer une notification pour l'utilisateur qui doit se fermer automatiquement après quelques secondes. Je l'ai vu que Nokia utilise beaucoup dans leur ui.
En ce moment je suis en utilisant le code ci-dessous afin que l'utilisateur peut fermer la QMessageBox mais je voudrais s'il était possible de fermer automatiquement le QMessageBox après 1 ou 2 secondes. Comment puis-je faire cela en utilisant Qt?
QMessageBox msgBox;
msgBox.setText("Hello!");
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.exec();
La solution
Je suggère à sous-classe QMessageBox
d'ajouter votre propre comportement souhaité ...
Il serait intéressant d'ajouter des méthodes comme setAutoClose(bool)
et setAutoCloseTimeout(int)
et déclencher une QTimer
sur showEvent
lorsque l'option est activée AutoClose!
De cette façon, vous pouvez même modifier l'apparence de votre QMessageBox
et avait un texte disant: « Cette boîte se ferme automatiquement en quelques secondes ... XXX » ou une barre de progression, etc ...
Autres conseils
Merci vraiment beaucoup! Ma solution:
J'ai créé ma propre classe (MessageBox) ceci est mon code pour montrer:
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();
Ceci est ma classe:
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);
}
}
Au lieu de cela, vous pouvez utiliser la minuterie de Singleshot
pour fermer une boîte de dialogue ou QLabel
avec beaucoup de facilité:
QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));
Avec ce code:
QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));
vous obtenez:
QObject::connect: Incompatible sender/receiver arguments
QTimer::timeout() --> QMessageBox::
Becouse MSGBOX (le récepteur) doit être un objet QtCore .. et QMessageBox subclassing QtGui. Voir https: / /srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot
Cela peut aider quelqu'un,
msgBox.button(QMessageBox::Ok)->animateClick(5000);
Le messageBox se ferme au bout de 5 secondes.