2010-02-10 6 views
8

Я создаю проект Qt Symbian и хочу показать уведомление для пользователя, которое должно автоматически закрываться через несколько секунд. Я видел, что Nokia использует это много в своих ui.Auto close QMessageBox

Сейчас я использую приведенный ниже код, чтобы пользователь мог закрыть QMessageBox, но я бы хотел его, если бы можно было автоматически закрыть QMessageBox через 1 или 2 секунды. Как я могу это сделать с помощью Qt?

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

ответ

4

Я хотел бы предложить подкласс QMessageBox, чтобы добавить свой собственный желаемое поведение ...

Было бы интересно добавить такие методы, как setAutoClose(bool) и setAutoCloseTimeout(int) и вызвать QTimer на showEvent, когда опция AutoClose включена!

Таким образом, вы можете даже изменить apparence вашего QMessageBox и имел текст, говоря «Это окно закроется автоматически через XXX секунд ...» или индикатор, и т.д. ...

5

спасибо очень много ! Мое решение:

Я создал свой собственный класс (MessageBox) это мой код, показывающий его:

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

Это мой класс:

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

где ваше определение startTimer? – qed

+3

Вы также можете использовать метод QAbstractPushButton.animateClick, просто добавив 'msgBox.setStandardButtons (QMessageBox :: Ok); msgBox.button (QMessageBox :: Ok) .animateClick (тайм-аут) ' –

1

Вместо этого вы можете использовать Singleshot таймер, чтобы закрыть любое диалоговое окно или QLabel с большой легкостью:

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

с помощью этого кода:

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

вы получите:

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

Becouse MsgBox (приемник) должен быть объектом QtCore .. и QMessageBox подклассов QtGui. См. https://srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot

 Смежные вопросы

  • Нет связанных вопросов^_^