ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
, всегда будет модальным, — независимо от значения, заданного вызовом метода setModal() . Чтобы диалоговое окно было не модальным, нужно ото- бражать его с помощью метода show() или setVisible() . После вызова этих методов 616 Часть II. Библиотека PyQt 5 следует вызвать методы raise_() (чтобы поместить окно поверх всех окон) и activateWindow() (чтобы сделать окно активным, т. е. имеющим фокус ввода). Указать, что окно является модальным, позволяет также метод setWindowModality(<Флаг>) класса QWidget . В качестве параметра могут быть указаны следующие атрибуты класса QtCore.Qt : • NonModal — 0 — окно не является модальным; • WindowModal — 1 — окно блокирует только родительские окна в пределах иерархии; • ApplicationModal — 2 — окно блокирует все окна в приложении. Окна, открытые из модального окна, не блокируются. Следует также учитывать, что метод setWindowModality() должен быть вызван до отображения окна. Получить текущее значение позволяет метод windowModality() класса QWidget . Прове- рить, является ли окно модальным, можно с помощью метода isModal() того же класса, который возвращает True , если окно является модальным, и False — в противном случае. Класс QDialog поддерживает следующие сигналы: accepted() — генерируется при установке флага Accepted (нажата кнопка OK). Не гене- рируется при закрытии окна с помощью метода hide() или setVisible() ; rejected() — генерируется при установке флага Rejected (нажата кнопка Cancel, кноп- ка Закрыть в заголовке окна или клавиша или setVisible() ; finished(<Код завершения>) — генерируется при установке кода завершения пользова- телем или вызовом методов accept() , reject() и done() . Внутри обработчика через па- раметр доступен целочисленный код завершения. Сигнал не генерируется при закрытии окна с помощью метода hide() или setVisible() Для всех кнопок, добавляемых в диалоговое окно, автоматически вызывается метод setAutoDefault() со значением True в качестве параметра. В этом случае кнопка может быть нажата с помощью клавиши С помощью метода setDefault() можно указать кнопку по умолчанию. Эта кнопка может быть нажата с помощью клавиши 26.2. Класс QDialogButtonBox Класс QDialogButtonBox представляет контейнер, в который можно добавить различные кнопки: как стандартные, так и пользовательские. Внешний вид контейнера и расположение кнопок в нем зависят от используемой операционной системы. Иерархия наследования для класса QDialogButtonBox : (QObject, QPaintDevice) — QWidget — QDialogButtonBox Форматы конструктора класса QDialogButtonBox : <Объект> = QDialogButtonBox([parent=None]) <Объект> = QDialogButtonBox(<Ориентация>[, parent=None]) <Объект> = QDialogButtonBox(<Стандартные кнопки>[, parent=None]) <Объект> = QDialogButtonBox(<Стандартные кнопки>, <Ориентация>[, parent=None]) Глава 26. Диалоговые окна 617 В параметре parent может быть указана ссылка на родительский компонент. Параметр <Ориентация> задает порядок расположения кнопок внутри контейнера. В качестве значения указываются атрибуты Horizontal (по горизонтали — значение по умолчанию) или Vertical (по вертикали) класса QtCore.Qt . В параметре <Стандартные кнопки> указываются следующие атрибуты (или их комбинация через оператор | ) класса QDialogButtonBox : NoButton — кнопки не установлены; Ok — кнопка OK с ролью AcceptRole ; Cancel — кнопка Cancel с ролью RejectRole ; Yes — кнопка Yes с ролью YesRole ; YesToAll — кнопка Yes to All с ролью YesRole ; No — кнопка No с ролью NoRole ; NoToAll — кнопка No to All с ролью NoRole ; Open — кнопка Open с ролью AcceptRole ; Close — кнопка Close с ролью RejectRole ; Save — кнопка Save с ролью AcceptRole ; SaveAll — кнопка Save All с ролью AcceptRole ; Discard — кнопка Discard или Don't Save (надпись на кнопке зависит от операционной системы) с ролью DestructiveRole ; Apply — кнопка Apply с ролью ApplyRole ; Reset — кнопка Reset с ролью ResetRole ; RestoreDefaults — кнопка Restore Defaults с ролью ResetRole ; Help — кнопка Help с ролью HelpRole ; Abort — кнопка Abort с ролью RejectRole ; Retry — кнопка Retry с ролью AcceptRole ; Ignore — кнопка Ignore с ролью AcceptRole Класс QDialogButtonBox наследует все методы базовых классов и поддерживает следующие дополнительные методы (здесь приведены только интересующие нас — полный их список можно найти на странице https://doc.qt.io/qt-5/qdialogbuttonbox.html): setOrientation(<Ориентация>) — задает порядок расположения кнопок внутри контей- нера. В качестве значения указываются атрибуты Horizontal (по горизонтали) или Vertical (по вертикали) класса QtCore.Qt ; setStandardButtons(<Стандартные кнопки>) — добавляет в контейнер стандартные кнопки: self.box.setStandardButtons(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) addButton() — добавляет кнопку в контейнер. Форматы метода: addButton(<Стандартная кнопка>) addButton(<Текст>, <Роль>) addButton( 618 Часть II. Библиотека PyQt 5 Первый формат добавляет стандартную кнопку или кнопки (значение параметра должно представлять собой один из рассмотренных ранее атрибутов класса QDialogButtonBox или их комбинацию через оператор | ). Второй формат принимает в качестве первого параметра надпись для добавляемой кнопки, а в качестве второго — ее роль. Третий формат принимает добавляемую кнопку в виде экземпляра одного из подклассов класса QabstractButton — как правило, класса QPushButton , представляющего обычную кнопку. В качестве роли указывается один из следующих атрибутов класса QDialogButtonBox : • InvalidRole — -1 — ошибочная роль; • AcceptRole — 0 — нажатие кнопки устанавливает код возврата равным значению атрибута Accepted ; • RejectRole — 1 — нажатие кнопки устанавливает код возврата равным значению атрибута Rejected ; • DestructiveRole — 2 — кнопка для отказа от изменений; • ActionRole — 3 — нажатие кнопки приводит к выполнению операции, которая не связана с закрытием окна; • HelpRole — 4 — кнопка для отображения справки; • YesRole — 5 — кнопка Yes; • NoRole — 6 — кнопка No; • ResetRole — 7 — кнопка для установки значений по умолчанию; • ApplyRole — 8 — кнопка для принятия изменений. Если роль недействительна, кнопка добавлена не будет. Первый и второй форматы возвращают ссылку на сгенерированную и добавленную в контейнер кнопку, третий не возвращает ничего: self.btnYes = QtWidget.QPushButton("&Да") self.box.addButton(self.btnYes, QtWidget.QDialogButtonBox.AcceptRole) self.btnNo = self.box.addButton(QtWidget.QDialogButtonBox.No) self.btnCancel = self.box.addButton("&Cancel", QtWidget.QDialogButtonBox.RejectRole) button(<Стандартная кнопка>) — возвращает ссылку на стандартную кнопку, соответст- вующую указанному обозначению, или None , если такой стандартной кнопки в контей- нере нет; standardButton( — возвращает обозначение стандартной кнопки, переданной в качестве параметра, или значение атрибута NoButton , если такой кнопки в контейнере нет; standardButtons() — возвращает комбинацию обозначений всех стандартных кнопок, добавленных в контейнер; buttonRole( — возвращает роль указанной в параметре кнопки. Если такая кнопка отсутствует, возвращается значение атрибута InvalidRole ; buttons() — возвращает список со ссылками на все кнопки, которые были добавлены в контейнер; Глава 26. Диалоговые окна 619 removeButton( — удаляет кнопку из контейнера, при этом не удаляя объект кнопки; clear() — очищает контейнер и удаляет все кнопки; setCenterButtons(<Флаг>) — если в качестве параметра указано значение True , кнопки будут выравниваться по центру контейнера. Класс QDialogButtonBox поддерживает следующие сигналы: accepted() — генерируется при нажатии кнопки с ролью AcceptRole или YesRole . Этот сигнал можно соединить со слотом accept() объекта диалогового окна: self.box.accepted.connect(self.accept) rejected() — генерируется при нажатии кнопки с ролью RejectRole или NoRole . Этот сигнал можно соединить со слотом reject() объекта диалогового окна: self.box.rejected.connect(self.reject) helpRequested() — генерируется при нажатии кнопки с ролью HelpRole ; clicked( — генерируется при нажатии любой кнопки внутри кон- тейнера. Внутри обработчика через параметр доступна ссылка на кнопку. 26.3. Класс QMessageBox Класс QMessageBox реализует стандартные окна-предупреждения для вывода сообщений. Иерархия наследования: (QObject, QPaintDevice) — QWidget — QDialog — QMessageBox Форматы конструктора класса QMessageBox : <Объект> = QMessageBox([parent=None]) <Объект> = QMessageBox(<Значок>, <Текст заголовка>, <Текст сообщения>[, buttons=NoButton][, parent=None][, flags=Dialog | MSWindowsFixedSizeDialogHint]) Если в параметре parent указана ссылка на родительское окно, диалоговое окно будет цен- трироваться относительно родительского окна, а не относительно экрана. Параметр flags задает тип окна (см. разд. 18.2). В параметре <Значок> могут быть указаны следующие атрибуты класса QMessageBox : NoIcon — 0 — нет значка; Question — 4 — значок со знаком вопроса; Information — 1 — значок информационного сообщения; Warning — 2 — значок предупреждающего сообщения; Critical — 3 — значок критического сообщения. В параметре buttons указываются следующие атрибуты (или их комбинация через опера- тор | ) класса QMessageBox : NoButton — кнопки не установлены; Ok — кнопка OK с ролью AcceptRole ; Cancel — кнопка Cancel с ролью RejectRole ; Yes — кнопка Yes с ролью YesRole ; 620 Часть II. Библиотека PyQt 5 YesToAll — кнопка Yes to All с ролью YesRole ; No — кнопка No с ролью NoRole ; NoToAll — кнопка No to All с ролью NoRole ; Open — кнопка Open с ролью AcceptRole ; Close — кнопка Close с ролью RejectRole ; Save — кнопка Save с ролью AcceptRole ; SaveAll — кнопка Save All с ролью AcceptRole ; Discard — кнопка Discard или Don't Save (надпись на кнопке зависит от операционной системы) с ролью DestructiveRole ; Apply — кнопка Apply с ролью ApplyRole ; Reset — кнопка Reset с ролью ResetRole ; RestoreDefaults — кнопка Restore Defaults с ролью ResetRole ; Help — кнопка Help с ролью HelpRole ; Abort — кнопка Abort с ролью RejectRole ; Retry — кнопка Retry с ролью AcceptRole ; Ignore — кнопка Ignore с ролью AcceptRole После создания экземпляра класса следует вызвать метод exec() (или оставленный для совместимости со старыми версиями PyQt метод exec_() ), чтобы вывести окно на экран. Метод возвращает числовое обозначение нажатой кнопки: dialog = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "Текст заголовка", "Текст сообщения", buttons = QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel, parent=window) result = dialog.exec() 26.3.1. Основные методы и сигналы Класс QMessageBox наследует все методы базовых классов и поддерживает следующие дополнительные методы (полный их список можно найти на странице https://doc.qt.io/ qt-5/qmessagebox.html ): setIcon(<Значок>) — устанавливает стандартный значок; setIconPixmap( — устанавливает пользовательский значок. В качестве пара- метра указывается экземпляр класса QPixmap ; setWindowTitle(<Текст заголовка>) — задает текст заголовка окна; setText(<Текст сообщения>) — задает текст сообщения. Можно указать как обычный текст, так и текст в формате HTML. Перенос строки в обычной строке осуществляется с помощью символа \n , а в строке в формате HTML — с помощью тега ; setInformativeText(<Текст>) — задает дополнительный текст сообщения, который ото- бражается под обычным текстом сообщения. Можно указать как обычный текст, так и HTML-код; Глава 26. Диалоговые окна 621 setDetailedText(<Текст>) — задает текст подробного описания сообщения. Если он задан, в окно будет добавлена кнопка Show Details, с помощью которой можно отобра- зить скрытую панель с подробным описанием; setTextFormat(<Режим>) — задает режим отображения текста сообщения. Могут быть указаны следующие атрибуты класса QtCore.Qt : • PlainText — 0 — простой текст; • RichText — 1 — форматированный текст; • AutoText — 2 — автоматическое определение (режим по умолчанию). Если текст содержит HTML-теги, используется режим RichText , в противном случае — режим PlainText ; setStandardButtons(<Стандартные кнопки>) — добавляет стандартные кнопки: dialog.setStandardButtons(QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) addButton() — добавляет кнопку в окно. Форматы метода: addButton(<Стандартная кнопка>) addButton(<Текст>, <Роль>) addButton( Первый формат добавляет стандартную кнопку или кнопки (значение параметра должно быть одним из рассмотренных ранее атрибутов класса QMessageBox или их комбинацией через оператор | ). Второй формат принимает в качестве первого параметра надпись для добавляемой кнопки, а в качестве второго — ее роль. Третий формат принимает добавляемую кнопку в виде экземпляра одного из подклассов класса QAbstractButton — как правило, класса QPushButton , представляющего обычную кнопку. В качестве роли указывается один из следующих атрибутов класса QMessageBox : • InvalidRole — -1 — ошибочная роль; • AcceptRole — 0 — нажатие кнопки устанавливает код возврата равным значению атрибута Accepted ; • RejectRole — 1 — нажатие кнопки устанавливает код возврата равным значению атрибута Rejected ; • DestructiveRole — 2 — кнопка для отказа от изменений; • ActionRole — 3 — нажатие кнопки приводит к выполнению операции, которая не связана с закрытием окна; • HelpRole — 4 — кнопка для отображения справки; • YesRole — 5 — кнопка Yes; • NoRole — 6 — кнопка No; • ResetRole — 7 — кнопка для установки значений по умолчанию; • ApplyRole — 8 — кнопка для принятия изменений. Если роль недействительна, кнопка добавлена не будет. Первый и второй форматы возвращают ссылку на сгенерированную и добавленную в окно кнопку, третий не возвращает ничего: 622 Часть II. Библиотека PyQt 5 btnYes = QtWidgets.QPushButton("&Да") dialog.addButton(btnYes, QtWidgets.QMessageBox.AcceptRole) btnNo = dialog.addButton("&Нет", QtWidgets.QMessageBox.RejectRole) btnCancel = dialog.addButton(QtWidgets.QMessageBox.Cancel) setDefaultButton() — задает кнопку по умолчанию, которая сработает при нажатии клавиши setEscapeButton() — задает кнопку, которая сработает при нажатии клавиши Форматы метода: setEscapeButton(<Стандартная кнопка>) setEscapeButton( setCheckBox( — задает флажок, который будет выводиться в окне. Чтобы убрать заданный ранее флажок, нужно передать значение None ; checkBox() — возвращает заданный в методе setCheckBox() флажок или None , если тако- вого нет; clickedButton() — возвращает ссылку на кнопку, которая была нажата, или значение None ; button(<Стандартная кнопка>) — возвращает ссылку на стандартную кнопку, соответст- вующую указанному обозначению, или None , если такой стандартной кнопки в контей- нере нет; standardButton( — возвращает обозначение стандартной кнопки, переданной в качестве параметра, или значение атрибута NoButton , если такой кнопки в контейнере нет; standardButtons() — возвращает комбинацию обозначений всех стандартных кнопок, добавленных в окно; buttonRole( — возвращает роль указанной в параметре кнопки. Если такая кнопка отсутствует, метод возвращает значение атрибута InvalidRole ; buttons() — возвращает список со ссылками на все кнопки, которые были добавлены в окно; removeButton( — удаляет кнопку из окна, при этом не удаляя объект кнопки. Класс QMessageBox поддерживает сигнал buttonClicked( |