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();
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top