Pergunta

Eu estou construindo um projeto Symbian Qt e eu quero mostrar uma notificação para o usuário que deve auto fechar após alguns segundos. Eu vi que a Nokia usa muito isso em sua ui.

Agora eu estou usando o código abaixo para que o usuário pode fechar o QMessageBox mas eu gostaria que ele se era possível auto perto do QMessageBox após 1 ou 2 segundos. Como posso fazer isso usando o Qt?

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

Solução

gostaria de sugerir a QMessageBox subclasse para adicionar seu próprio comportamento desejado ...

Seria interessante para adicionar métodos como setAutoClose(bool) e setAutoCloseTimeout(int) e desencadear um QTimer em showEvent quando a opção AutoClose está habilitado!

Desta forma, você pode até mesmo alterar o apparence do seu QMessageBox e tinha um texto dizendo "Esta caixa irá fechar automaticamente em segundos XXX ..." ou uma barra de progresso, etc ...

Outras dicas

Graças realmente muito! Minha solução:

Eu criei minha própria classe (MessageBox) este é o meu código para mostrá-lo:

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

Em vez disso você pode usar temporizador Singleshot para fechar qualquer caixa de diálogo ou QLabel com muita facilidade:

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

Com este código:

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

você obtém:

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

Becouse MsgBox (o receptor) deve ser um objeto QtCore .. e QMessageBox subclasse QtGui. Consulte https: / /srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot

Esta ajuda pode alguém,

msgBox.button(QMessageBox::Ok)->animateClick(5000);

Os fecha MESSAGEBOX após 5 segundos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top