Tutorial :Auto close QMessageBox



Question:

I'm building a Qt Symbian Project and I want to show a notification for the user that should auto close after some seconds. I have seen that Nokia uses this a lot in their ui.

Right now I'm using the code below so that the user can close the QMessageBox but I would like it if it was possible to auto close the QMessageBox after 1 or 2 seconds. How can I do this using Qt?

QMessageBox msgBox;  msgBox.setText("Hello!");  msgBox.setIcon(QMessageBox::Information);  msgBox.setStandardButtons(QMessageBox::Ok);  msgBox.exec();  


Solution:1

I would suggest to subclass QMessageBox to add your own desired behavior...

It would be interesting to add methods like setAutoClose(bool) and setAutoCloseTimeout(int) and trigger a QTimer on showEvent when the AutoClose option is enabled !

This way, you could even alter the apparence of your QMessageBox and had a text saying "This box will close automatically in XXX seconds..." or a progress bar, etc...


Solution:2

Thanks really much! My solution:

I created my own class (MessageBox) this is my code for showing it:

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();  

This is my class:

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);      }  }  


Solution:3

Instead you can use Singleshot Timer to close any dialog box or QLabel with much ease:

QTimer *timer;  QTimer::singleShot(10000, msgBox, SLOT(close()));  


Solution:4

With this code:

QTimer *timer;  QTimer::singleShot(10000, msgBox, SLOT(close()));  

you get:

QObject::connect: Incompatible sender/receiver arguments          QTimer::timeout() --> QMessageBox::  

Becouse msgBOx (the receiver) must be a QtCore object.. and QMessageBox subclassing QtGui. See https://srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »