2016-02-24 5 views
0

Я делаю QWizard с QT 4.8.5, а на некоторых страницах мне нужно закрыть некоторые другие приложения и выйти из моей программы. Это прекрасно работает, но теперь я хочу показать всплывающее сообщение, которое сообщает пользователю, что программы перезапускаются (есть и другие мои, а мой - последний, который должен быть закрыт всегда). Код я использую, чтобы показать всплывающее это следующий один, и я поместить его в validatepage в виде QWizardPage:Qt 4.8.5 Понимание QMessagebox .exec() и .show()

QMessageBox *msgBox1 = new QMessageBox; 
    msgBox1->setWindowTitle("Title..."); 
    msgBox1->setIcon(QMessageBox::Information); 
    msgBox1->setText(" blablablalbal bla bla bla."); 
    msgBox1->setWindowModality(Qt::NonModal); 
    msgBox1->show(); 
    QCoreApplication::processEvents(); // without this line, the show does nothing and I can't see my pop up window 

Так что вещь: С этим кодом, когда я в этом wizardpage и нажмите, чтобы завершить , он запускает QMessageBox, в то время как (позади) программа перезапускает другие приложения, а затем закрывается (с QApplication :: quit();), что именно то, что я хочу ... НО ни одно сообщение не отображается во всплывающем окне. .. Я не вижу иконку, название или текст ...: SI не знаю, почему :(

Принимая во внимание, что при использовании -> exec() вместо показа, значок, название и текст отображаются, но когда появляется всплывающее окно, ничего не происходит, пока пользователь не закроет всплывающее окно: S

Я понимаю, что .exec() замораживает все, пока пользователь не закроет всплывающее во время шоу не ...

Итак ... как я могу видеть текст с шоу() поведение ?? Я не хочу, чтобы пользователь взаимодействовал с этим всплывающим окном, мне просто нужно всплывающее окно, пока оно закрывается, пока моя программа не закроется ...

Огромное вам спасибо!

+0

Закомментированный последняя строка говорит 'шоу()' вызов не делает ничего без этого, но ваш вопрос говорит вы ничего не видите ... Вы можете уточнить? Это похоже на противоречие. Независимо от того, соответствующий полутоп: http://comments.gmane.org/gmane.comp.lib.qt.general/30706 – eclarkso

+0

@eclarkso Да, извините, может быть, я не ошибся ...Если я не использую строку processEvents, то всплывающее окно никогда не появляется, так же, как если бы я не делал этот код ... while, если я поместил эту строку, я вижу всплывающее окно, но это всплывающее окно пуст. . no message, no title нет значка, показанного (И его хорошо инициализированный я думаю, как будто я меняю шоу для exe, тогда я вижу это так, как должен (но потом он ждет, чтобы кто-то закрыл его, прежде чем продолжить) Надеюсь, что он станет более ясным: D – Megasa3

ответ

1

Соответствующие: http://comments.gmane.org/gmane.comp.lib.qt.general/30706

В целом, QDialog::exec() создает модальное диалоговое окно (независимо от параметров Qt::NonModal) со своим собственным циклом обработки событий, и ::show() не делает.

Так что в вашем случае ::exec() полностью отобразит диалоговое окно, но оно блокирует остальную часть вашей фоновой обработки. ::show() не будет блокироваться, но поскольку он делится контуром событий с другим кодом, он не пытается опорожнить очередь событий (которая имеет все события show/layout/render из вашего диалога) из-за вашего фонового кода.

Я хотел бы попробовать следующее:

  • использования ::show() не ::exec()
  • сила вашего диалога на фронт с помощью QDialog::raise() и Dialog::activateWindow()
  • (важная часть) либо
    • вызова QApplication::processEvents() в задачах фоновой обработки (например, в long-ru nning).
    • порождает вашу фоновую обработку в поток (это может быть или не быть легким в зависимости от того, как структурирован ваш код), чтобы позволить основному циклу событий обрабатывать ваши события диалога.

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

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