2015-01-20 6 views
0

Это работает:близко QMessageBox, когда определенное условие выполняется

#ifndef MYWARMUPMESSAGEBOX_H 
#define MYWARMUPMESSAGEBOX_H 

#include <QMessageBox> 
#include <QPushButton> 
#include <QTimer> 

class myWarmUpMessageBox : public QMessageBox 
{ 
    Q_OBJECT 

private: 

    QString _text; 
    int _timeoutSeconds; 
    QTimer _timer; 
    int num = 0; 

public: 
explicit myWarmUpMessageBox(QWidget * parent): 
    QMessageBox(parent) 
    { 
     connect(&_timer, SIGNAL(timeout()), this, SLOT(updateText())); 
     _timer.start(500); 
    } 

    virtual void showEvent(QShowEvent * e) 
    { 
     QMessageBox::showEvent(e); 
     updateText(); 
    } 

public slots: 

void updateText() 
{ 
    num+=1; 
    setText(QString::number(num)); 

    if(num>3) 
     this->close(); 
} 

Я использую этот QMessageBox в QMainWindow в его близком событии.

void MainWindow::closeEvent(QCloseEvent *event) 
{ 
    myWarmUpMessageBox * myBox = new myWarmUpMessageBox(this); 
    myBox->exec(); 
    event->accept(); 
} 

QMessageBox всплывает, подсчитывает до 3 diappears и subsenquently Функция QMainWindow закрывает.

НО он не работает, если условие закрытия немедленно выполнено, то есть, говоря

if(num>0) 
    this->close(); 

, которое истинно, когда таймер запускается в первый раз, программа тормозов. Зачем???

+0

Это также верно, когда окно вашего сообщения становится видимым. «программа тормозит», - что это значит? – vahancho

+0

Это замерзает. Это не зависает, если функция updateText вызывается не реже двух раз (т. Е. Таймер отключается дважды). – newandlost

ответ

0

Вы должны позволить QMessageBox открываться полностью и максимизироваться, а затем вам нужно только закрыть его, иначе QMessageBox Dialog не может быть зарегистрирован/полностью загружен, поскольку функция закрытия будет успешной.

То же самое можно сказать о closeevent, если вы попытаетесь получить доступ к свойствам виджета Dialog внутри диалогового окна closeevent.

+0

ах вы правы! Думаю, мне нужно подождать с чем угодно, пока шоу не закончится. Поэтому я, вероятно, запускаю таймер с событием show, который затем обновляет текст. – newandlost

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