Вы не задаете в модальном диалоговом окне флаг модального режима равным TRUE
exec
заставляет диалоговое окно перейти в модальный режим независимо от значения этого флага.Конструктор вашего диалогового окна будет выглядеть примерно следующим образом:
MySMDialog::MySMDialog(QWidget *parent, const char *name):
QDialog(parent, name, TRUE) {
...
}
После того как вы определили ваше диалоговое окно, вызовите функцию show
QApplication::processEvents
для обновления вашего диалогового окна:MySMDialog *dialog = MySMDialog(this, "semimodal");
dialog->show();
while (processing) {
doSomeProcessing();
app->processEvents();
if (dialog->wasCancelled()) break;
}
Перед продолжением выполнения проверьте, не уничтожено ли диалоговое окно. Имейте в виду, что функция wasCancelled
QDialog
— вы должны написать ее самостоятельно.Комплект Qt предоставляет готовые подклассы класса QDialog
QMessageBox
У класса QMessageBox
#include
int information(QWidget *parent, const QString& caption,
const QString&text, int button0, int button1=0, int button2=0);
int warning(QWidget *parent, const QString& caption,
const QString& text, int button0, int button1, int button2=0);
int critical(QWidget *parent, const QString& caption,
const QString& text, int button0, int button1, int button2=0);
Можно выбрать кнопки из списка готовых кнопок QMessageBox
□ QMessageBox::Ok
□ QMessageBox::Cancel
□ QMessageBox::Yes
□ QMessageBox::No
□ QMessageBox::Abort
□ QMessageBox::Retry
□ QMessageBox::Ignore
Типичный пример использования окна QMessageBox
int result = QMessageBox::information(this,
"Engine Room Query",
"Do you wish to engage the HyperDrive?",
QMessageBox::Yes | QMessageBox::Default,
QMessageBox::No | QMessageBox::Escape);
switch (result) {
case QMessageBox::Yes:
hyperdrive->engage();
break;
case QMessageBox::No:
// сделайте что-нибудь еще
break;
}
Вы соединили операцией OR
|
) коды кнопок с вариантами Default
и Escape
, чтобы задать стандартные действия, при нажатии клавиш Рис. 17.8
Окно QInputDialog
QInputDialog
есть статические методы, например QMessageBox
, создающие некоторые проблемы, поскольку у них слишком много параметров, к счастью, у большинства из них есть значения по умолчанию:#include
QString getText(const QString& caption, const QString& label,
QLineEdit::EchoMode mode=QLineEdit::Normal,
const QString& text=QString::null,
bool* ok = 0, QWidget* parent = 0, const char * name = 0);
QString getItem(const QString& caption, const QString& label,