Шаг 241.
Библиотека PyQt5.
Диалоговые окна. Пользовательские диалоговые окна
На этом шаге мы рассмотрим класс, реализующий такие окна, перечислим его основные методы.
Класс QDialog реализует диалоговое окно. По умолчанию окно выводится с рамкой и заголовком, в котором расположены кнопки Справка и Закрыть. Размеры окна
можно изменять с помощью мыши. Иерархия наследования для класса QDialog выглядит так:
(QObject, QPaintDevice) - QWidget - QDialog
Конструктор класса QDialog имеет следующий формат:
<Объект> = QDialog ([parent=<Родитель>] [, flags=<Тип окна>])
В параметре parent указывается ссылка на родительское окно. Если параметр не указан или имеет значение None, то диалоговое окно будет центрироваться относительно экрана. Если
указана ссылка на родительское окно, то диалоговое окно будет центрироваться относительно родительского окна, - это также позволяет создать модальное диалоговое окно, которое будет блокировать
только окно родителя, а не все окна приложения. Какие именно значения можно указать в параметре flags, мы уже рассматривали на 25 шаге. Тип окна по умолчанию - Dialog.
Класс QDialog наследует все методы из базовых классов и дополнительно реализует следующие методы (здесь приведены только основные - полный их список доступен на странице
https://doc.qt.io/qt-5/qdialog.html):
- exec () - отображает модальное диалоговое окно, дожидается закрытия окна и возвращает код возврата в виде значения следующих атрибутов класса QDialog:
- Accepted (или 1) - нажата кнопка ОК;
- Rejected (или 0) - нажата кнопка Cancel, кнопка Закрыть в заголовке окна или клавиша Esc.
Метод является слотом. Вместо него можно использовать метод ехес_(), предусмотренный для совместимости с предыдущими версиями PyQt.
Вот пример отображения диалогового окна и обработки статуса внутри обработчика нажатия кнопки (класс MyDialog является наследником класса QDialog, a window - ссылка на главное окно):
def on_clicked():
dialog = MyDialog(window)
result = dialog.exec_()
if result == QtWidgets.QDialog.Accepted:
print("Нажата кнопка ОК")
# Здесь получаем данные из диалогового окна
else:
print("Нажата кнопка Cancel")
- accept () - закрывает модальное диалоговое окно и устанавливает код возврата равным значению атрибута Accepted класса QDialog. Метод является слотом. Обычно его соединяют с сигналом нажатия кнопки ОК:
self.btnOK.clicked.connect(self.accept)
- reject () - закрывает модальное диалоговое окно и устанавливает код возврата равным значению атрибута Rejected класса QDialog. Метод является слотом. Обычно его соединяют с сигналом нажатия кнопки Cancel:
self.btnCancel.clicked.connect(self.reject)
- done (<Koд возврата>) - закрывает модальное диалоговое окно и устанавливает код возврата равным значению параметра. Метод является слотом;
- setResult (<Koд возврата>) - устанавливает код возврата;
- result () - возвращает код завершения;
- setSizeGripEnabled (<Флаг>) - если в качестве параметра указано значение True, то в правом нижнем углу диалогового окна будет отображен значок изменения размера, а если False - то скрыт (значение по умолчанию);
- isSizeGripEnabled () - возвращает значение True, если значок изменения размера отображается в правом нижнем углу диалогового окна, и False - в противном случае;
- setVisible (<Флаг>) - если в параметре указано значение True, диалоговое окно будет отображено, а если значение False - то скрыто. Вместо этого метода можно пользоваться более удобными методами show() и hide();
- open () - отображает диалоговое окно в модальном режиме, но не дожидается его закрытия. Блокируется только родительское окно, а не все окна приложения. Метод является слотом;
- setModal (<Флаг>) - если в качестве параметра указано значение True, окно будет модальным, а если False - обычным. Обратите внимание, что окно, открываемое с помощью метода exec(), всегда будет модальным, -
независимо от значения, заданного вызовом метода setModal(). Чтобы диалоговое окно было не модальным, нужно отображать его с помощью метода show() или setVisible().
После вызова этих методов следует вызвать методы raise_() (чтобы поместить окно поверх всех окон) и activateWindow() (чтобы сделать окно активным, то есть имеющим фокус ввода).
Указать, что окно является модальным, позволяет также метод setWindowModality(<Флаг>) класса QWidget. В качестве параметра могут быть указаны следующие атрибуты класса Qtcore.Qt:
- NonModal (или 0) - окно не является модальным;
- WindowModal (или 1) - окно блокирует только родительские окна в пределах иерархии;
- ApplicationModal (или 2) - окно блокирует все окна в приложении.
Окна, открытые из модального окна, не блокируются. Следует также учитывать, что метод setWindowModality() должен быть вызван до отображения окна.
Получить текущее значение позволяет метод windowModality() класса QWidget. Проверить, является ли окно модальным, можно с помощью метода isModal() того же класса,
который возвращает True, если окно является модальным, и False - в противном случае.
Класс QDialog поддерживает следующие сигналы:
- accepted () - генерируется при установке флага Accepted (нажата кнопка ОК). Не генерируется при закрытии окна с помощью метода hide() или setVisible();
- rejected () - генерируется при установке флага Rejected (нажата кнопка Cancel, кнопка Закрыть в заголовке окна или клавиша Esc). He генерируется при закрытии окна
с помощью метода hide() или setVisible();
- finished (<Koд завершения>) - генерируется при установке кода завершения пользователем или вызовом методов accept(), reject() и done(). Внутри обработчика через параметр доступен целочисленный код завершения.
Сигнал не генерируется при закрытии окна с помощью метода hide() или setVisible().
Для всех кнопок, добавляемых в диалоговое окно, автоматически вызывается метод setAutoDefault() со значением True в качестве параметра. В этом случае кнопка может быть нажата
с помощью клавиши Enter при условии, что она находится в фокусе. По умолчанию нажать кнопку позволяет только клавиша Пробел.
С помощью метода setDefauit() можно указать кнопку по умолчанию. Эта кнопка может быть нажата с помощью клавиши Enter, когда фокус ввода установлен на другой компонент, например на текстовое поле.
На следующем шаге мы рассмотрим класс QDialogButtonBox.
Предыдущий шаг
Содержание
Следующий шаг