2015-02-27 5 views
0

Мне нужно открыть QDialog с помощью QTimer singleShot и ждать флаг состояния. Если эта переменная истинна, то продолжайте.Как использовать QTimer singleShot с QEventLoop в Qt

Это мой код

StatusFlag = FALSE;

void MainWindow::OpenWindow() 
{ 
    qDebug("OpenWindow"); 
    NewGUI *gui=new NewGUI(); 
    gui->setModal(true); 
    gui->exec(); 
} 
void MainWindow::mWait(ulong milliSeconds) 
{ 
    QEventLoop loop; 
    QTimer::singleShot(milliSeconds, &loop, SLOT(quit())); 
    loop.exec(); 
} 

В NewGUI конструктор StatusFlag установлен в ИСТИНА

QTimer::singleShot(0, this, SLOT(OpenWindow())); 
while(StatusFlag == FALSE) 
{ 
    //Wait until StatusFlag is TRUE. 
    qDebug("Enter"); 
    mWait(1); 
    qDebug("Exit");   
} 

if(StatusFlag == TRUE) 
{ 
    //Do something 
    qDebug("Do something"); 
} 

токовый выход

Enter 
OpenWindow 

Ожидаемый результат является

Enter 
Exit 
OpenWindow 
Do something 

Если я закомментировать строку

QTimer :: SingleShot (0, это, SLOT (OpenWindow()));

Тогда выход

Enter 
Exit.. still continuing 

Есть ли у вас какие-либо предложения?

+4

Не используйте какой-либо механизм ожидания в потоке графического интерфейса пользователя. Это управляемое событиями программирование. Воспользуйтесь этим. Используйте сигналы и слоты. – thuga

ответ

0

В вашем коде gui->exec(); запускает новый локальный цикл событий, поэтому вы никогда не выходите из OpenWindow(). Поэтому ваш цикл while будет блокироваться в mWait(1);, пока вы не закроете диалог.

Вместо того, чтобы устанавливать флаг, вы можете испустить сигнал в конструкторе NewGUI, к которому вы можете подключить слот MainWindow. Вы можете делать все, что вам нужно сделать в этом слоте.

+0

Спасибо за разъяснение – user2214646