Domanda
Sto costruendo un progetto Symbian Qt e voglio mostrare una notifica per l'utente che dovrebbe auto vicino dopo alcuni secondi. Ho visto che Nokia utilizza questo molto nella loro interfaccia utente.
In questo momento sto usando il codice seguente in modo che l'utente può chiudere il QMessageBox ma mi sarebbe piaciuto se fosse possibile per l'auto chiudere il QMessageBox dopo 1 o 2 secondi. Come posso fare questo usando Qt?
QMessageBox msgBox;
msgBox.setText("Hello!");
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.exec();
Soluzione
Vorrei suggerire di sottoclasse QMessageBox
aggiungere la tua comportamento desiderato ...
Sarebbe interessante aggiungere metodi come setAutoClose(bool)
e setAutoCloseTimeout(int)
e innescare un QTimer
sul showEvent
quando l'opzione AutoClose è abilitato!
In questo modo, si potrebbe anche alterare l'apparence del vostro QMessageBox
e aveva un testo che dice "Questa casella si chiuderà automaticamente in secondi XXX ..." o una barra di avanzamento, ecc ...
Altri suggerimenti
Grazie davvero tanto! La mia soluzione:
Ho creato la mia stessa classe (MessageBox) questo è il mio codice per mostrare che:
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();
Questa è la mia 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);
}
}
Invece è possibile utilizzare Timer Singleshot
per chiudere qualsiasi finestra di dialogo o QLabel
con molta facilità:
QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));
Con questo codice:
QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));
si ottiene:
QObject::connect: Incompatible sender/receiver arguments
QTimer::timeout() --> QMessageBox::
siccome MsgBox (ricevitore) deve essere un oggetto QtCore .. e QMessageBox sottoclassi QtGui. Vedere https: / /srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot
Questo può aiutare qualcuno,
msgBox.button(QMessageBox::Ok)->animateClick(5000);
Il messageBox chiude dopo 5 secondi.