У объекта QDialog
accept
и reject
, которые применяются для обозначения результата, полученного в диалоговом окне. Этот результат возвращается методом exec. Как правило, вы будете связывать кнопки OK и Cancel со слотами, как в MyDialog
.Для применения диалогового окна как модального вы вызываете метод exec
QDialog::Accepted
или QDialog::Rejected
в зависимости от того, какой слот был активизирован:MyDialog* dialog = new MyDialog(this, "mydialog");
if (dialog->exec == QDialog::Accepted) {
// Пользователь щелкнул мышью кнопку OK
doSomething;
} else {
// Пользователь щелкнул мышью кнопку Cancel или
// диалоговое окно уничтожено
doSomethingElse;
}
delete dialog;
Когда метод exec
Учтите, что когда вызывается exec
Немодальные диалоговые окна слегка отличаются от обычных основных окон прежде всего тем, что располагаются поверх своего родительского окна, совместно используют их элемент на панели задач и автоматически скрываются, когда вызван слот accept
reject
.Для отображения немодального диалогового окна вызывайте метод show
QMainWindow
:MyDialog *dialog = new MyDialog(this, "mydialog");
dialog->show;
Функция show
MyDialog::MyDialog(QWidget *parent, const char *name) :
QDialog(parent, name) {
...
connect(ok_pushbutton, SIGNAL(clicked), this, SLOT(OkClicked));
connect(cancel_pushbutton, SIGNAL(clicked), this, SLOT(CancelClicked));
}
MyDialog::OkClicked {
// Выполните что-либо
}
MyDialog::CancelClicked {
// Выполните что-либо другое
}
Как и в случае модального окна, диалоговое окно автоматически скрывается при нажатии кнопки.
Для создания полумодального диалогового окна вы должны задать флаг модального режима в конструкторе QDialog
show
:QDialog(QWidget *parent=0, const char *name=0, bool modal=FALSE, WFlags f=0);
Вы не задаете в модальном диалоговом окне флаг модального режима равным 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