ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 841
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Глава 17. Знакомство с PyQt 5 359 17.10. Вывод заставки
В больших приложениях загрузка начальных данных может занимать продолжительное время, в течение которого принято выводить окно-заставку, в котором отображается про- цесс загрузки. По окончании инициализации приложения окно-заставка скрывается и ото- бражается главное окно.
Для вывода окна-заставки в PyQt предназначен класс
QSplashScreen из модуля
QtWidgets
Конструктор класса имеет следующие форматы:
<Объект> = QSplashScreen([<Изображение>][, flags=<Тип окна>])
<Объект> = QSplashScreen(<Родитель>[, <Изображение>][, flags=<Тип окна>])
Параметр
<Родитель>
позволяет указать ссылку на родительский компонент. В параметре
<Изображение>
указывается ссылка на изображение (экземпляр класса
QPixmap
, объявленно- го в модуле
QtGui
), которое будет отображаться на заставке. Конструктору класса
QPixmap можно передать путь к файлу с изображением. Параметр flags предназначен для указания типа окна — например, чтобы заставка отображалась поверх всех остальных окон, следует передать флаг
WindowStaysOnTopHint
Класс
QSplashScreen поддерживает следующие методы:
show()
— отображает заставку;
finish(<Ссылка на окно>)
— закрывает заставку. В качестве параметра указывается ссылка на главное окно приложения;
showMessage(<Сообщение>[, <Выравнивание>[, <Цвет>]])
— выводит сообщение. Во вто- ром параметре указывается местоположение надписи в окне. По умолчанию надпись выводится в левом верхнем углу окна. В качестве значения можно через оператор
| ука- зать комбинацию следующих флагов:
AlignTop
(по верху),
AlignCenter
(по центру вер- тикали и горизонтали),
AlignBottom
(по низу),
AlignHCenter
(по центру горизонтали),
AlignVCenter
(по центру вертикали),
AlignLeft
(по левой стороне),
AlignRight
(по пра- вой стороне). В третьем параметре указывается цвет текста. В качестве значения можно указать атрибут из класса
QtCore.Qt
(например, black
(по умолчанию), white и т. д.) или экземпляр класса
QColor
(например,
QColor("red")
,
QColor("#ff0000")
,
QColor(255, 0, 0)
и др.);
clearMessage()
— стирает надпись;
setPixmap(<Изображение>)
— позволяет изменить изображение в окне. В качестве пара- метра указывается экземпляр класса
QPixmap
;
pixmap()
— возвращает изображение в виде экземпляра класса
QPixmap
Пример кода, выводящего заставку, показан в листинге 17.20. А на рис. 17.6 можно увидеть эту заставку воочию.
Листинг 17.20. Вывод заставки
# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets import time class MyWindow(QtWidgets.QPushButton): def __init__(self):
360
Часть II. Библиотека PyQt 5
1 ... 30 31 32 33 34 35 36 37 ... 83
QtWidgets.QPushButton.__init__(self) self.setText("Закрыть окно") self.clicked.connect(QtWidgets.qApp.quit) def load_data(self, sp): for i in range(1, 11): # Имитируем процесс time.sleep(2) # Что-то загружаем sp.showMessage("Загрузка данных... {0}%".format(i * 10),
QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom, QtCore.Qt.black)
QtWidgets.qApp.processEvents() # Запускаем оборот цикла if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) splash = QtWidgets.QSplashScreen(QtGui.QPixmap("splashscreen.jpg")) splash.showMessage("Загрузка данных... 0%",
QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom, QtCore.Qt.black) splash.show() # Отображаем заставку
QtWidgets.qApp.processEvents() # Запускаем оборот цикла window = MyWindow() window.setWindowTitle("Использование класса QSplashScreen") window.resize(300, 30) window.load_data(splash) # Загружаем данные window.show() splash.finish(window) # Скрываем заставку sys.exit(app.exec_())
Рис. 17.6. Заставка, выводимая на экран кодом из листинга 17.20
Глава 17. Знакомство с PyQt 5 361 17.11. Доступ к документации
Библиотека PyQt включает в себя несколько сотен классов. Понятно, что описать их все в одной книге не представляется возможным, поэтому мы рассмотрим здесь только наибо- лее часто используемые возможности библиотеки. А чтобы получить полную информацию, следует обратиться к документации.
Самая последняя версия документации в формате HTML доступна по интернет-адресу: http://pyqt.sourceforge.net/Docs/PyQt5/. Там рассматриваются основные вопросы PyQt-про- граммирования: работа с сигналами, использование Qt Designer, отличия PyQt5 от PyQt 4 и пр.
П
РИМЕЧАНИЕ
Ранее эта документация поставлялась непосредственно в составе PyQt вместе с примера- ми программирования. Однако теперь, к сожалению, ни того, ни другого в поставке библио- теки нет.
В правом верхнем углу любой страницы документации находится гиперссылка Classes, ведущая на страницу со списком всех классов, что имеются в библиотеке. Название каж- дого класса является ссылкой на страницу с описанием этого класса, где имеется гипер- ссылка, в свою очередь ведущая на страницу сайта http://doc.qt.io/ с полным описанием этого класса.
Также в правом верхнем углу любой страницы имеется гиперссылка Modules, ведущая на страницу со списком всех модулей, составляющих PyQt. Аналогично, каждое название модуля является гиперссылкой, ведущей на страницу со списком всех классов, которые определены в этом модуле. Названия классов также являются гиперссылками, ведущими на страницы с описаниями этих классов.
С
ОВЕТ
Увы, но от документации, опубликованной на сайте http://pyqt.sourceforge.net/Docs/PyQt5/, немного толку. Поэтому лучше сразу же обратиться к сайту http://doc.qt.io/, где приводится полное описание библиотеки Qt, правда, рассчитанное на разработчиков, которые про- граммируют на C++.
ГЛ А В А
18
Управление окном приложения
Создать окно и управлять им позволяет класс
QWidget
. Он наследует классы
QObject и
QPaintDevice и, в свою очередь, является базовым классом для всех визуальных компонен- тов, поэтому любой компонент, не имеющий родителя, обладает своим собственным окном.
В этой главе мы рассмотрим методы класса
QWidget применительно к окну верхнего уровня, однако следует помнить, что те же самые методы можно применять и к любым компонен- там. Так, метод, позволяющий управлять размерами окна, можно использовать и для изме- нения размеров компонента, имеющего родителя. Тем не менее, некоторые методы имеет смысл использовать только для окон верхнего уровня, — например, метод, позволяющий изменить текст в заголовке окна, не имеет смысла использовать в обычных компонентах.
Для создания окна верхнего уровня, помимо класса
QWidget
, можно использовать и другие классы, которые являются его наследниками, — например,
QFrame
(окно с рамкой) или
QDialog
(диалоговое окно). При использовании класса
QDialog окно будет выравниваться по центру экрана или родительского окна и иметь в заголовке только две кнопки: Справка и
Закрыть. Кроме того, можно использовать класс
QMainWindow
, который представляет глав- ное окно приложения с меню, панелями инструментов и строкой состояния. Использование классов
QDialog и
QMainWindow имеет свои различия, которые мы рассмотрим в отдельных главах.
18.1. Создание и отображение окна
Самый простой способ создать пустое окно показан в листинге 18.1.
Листинг 18.1. Создание и отображение окна
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() # Создаем окно window.setWindowTitle("Заголовок окна") # Указываем заголовок window.resize(300, 50) # Минимальные размеры window.show() # Отображаем окно sys.exit(app.exec_())
Глава 18. Управление окном приложения
363
Конструктор класса
QWidget имеет следующий формат:
<Объект> = QWidget([parent=<Родитель>][, flags=<Тип окна>])
В параметре parent указывается ссылка на родительский компонент. Если параметр не ука- зан или имеет значение
None
, компонент будет обладать своим собственным окном. Если в параметре flags указан тип окна, то компонент, имея родителя, также будет обладать своим собственным окном, но окажется привязан к родителю. Это позволяет, например, создать модальное окно, которое станет блокировать только окно родителя, а не все окна приложения. Какие именно значения можно указать в параметре flags
, мы рассмотрим в следующем разделе.
Указать ссылку на родительский компонент и, возможно, тип окна уже после создания объ- екта позволяет метод setParent()
. Формат метода: setParent(<Родитель>[, <Тип окна>])
Получить ссылку на родительский компонент можно с помощью метода parentWidget()
Если компонент не имеет родителя, возвращается значение
None
Для изменения текста в заголовке окна предназначен метод setWindowTitle()
. Формат метода: setWindowTitle(<Текст, отображаемый в заголовке>)
Метод windowTitle()
позволяет получить текст, выводящийся в заголовке окна.
После создания окна необходимо вызвать метод show()
, чтобы вывести окно на экран. Для скрытия окна предназначен метод hide()
. Для отображения и скрытия компонентов можно также пользоваться методом setVisible(<Флаг>)
. Если параметром этого метода передано значение
True
, компонент будет отображен, а если значение
False
— скрыт. Пример ото- бражения окна: window.setVisible(True)
Проверить, видим компонент в настоящее время или нет, позволяет метод isVisible()
, ко- торый возвращает
True
, если компонент видим, и
False
— в противном случае. Кроме того, можно воспользоваться методом isHidden()
— он возвращает
True
, если компонент скрыт, и
False
— в противном случае.
18.2. Указание типа окна
При использовании класса
QWidget окно по умолчанию создается с заголовком, в котором расположены значок, при нажатии на который выводится оконное меню, текст заголовка и кнопки Свернуть, Развернуть и Закрыть. Указать другой тип создаваемого окна позволя- ет метод setWindowFlags()
или параметр flags в конструкторе класса
QWidget
. Обратите внимание, что метод setWindowFlags()
должен вызываться перед отображением окна. Фор- мат метода: setWindowFlags(<Тип окна>)
В параметре
<Тип окна>
можно указать следующие атрибуты из класса
QtCore.Qt
:
Widget
— тип по умолчанию для класса
QWidget
;
Window
— указывает, что компонент является окном, независимо от того, имеет он роди- теля или нет. Окно выводится с рамкой и заголовком, в котором расположены кнопки
Свернуть, Развернуть и Закрыть. По умолчанию размеры окна можно изменять с по- мощью мыши;
364
Часть II. Библиотека PyQt 5
Dialog
— диалоговое окно. Выводится с рамкой и заголовком, в котором расположены кнопки Справка и Закрыть. Размеры окна можно изменять с помощью мыши. Это зна- чение по умолчанию для класса
QDialog
. Пример указания типа для диалогового окна: window.setWindowFlags(QtCore.Qt.Dialog)
Sheet и
Drawer
— окна в стиле Apple Macintosh;
Popup
— указывает, что окно представляет собой всплывающее меню. Оно выводится без рамки и заголовка и, кроме того, может отбрасывать тень. Изменить размеры окна с помощью мыши нельзя;
Tool
— сообщает, что окно представляет собой панель инструментов. Оно выводится с рамкой и заголовком (меньшим по высоте, чем обычное окно), в котором расположена кнопка Закрыть. Размеры окна можно изменять с помощью мыши;
ToolTip
— указывает, что окно представляет собой всплывающую подсказку. Оно выво- дится без рамки и заголовка. Изменить размеры окна с помощью мыши нельзя;
SplashScreen
— сообщает, что окно представляет собой заставку. Оно выводится без рамки и заголовка. Изменить размеры окна с помощью мыши нельзя. Это значение по умолчанию для класса
QSplashScreen
;
Desktop
— указывает, что окно представляет собой рабочий стол. Оно вообще не ото- бражается на экране;
SubWindow
— сообщает, что окно представляет собой дочерний компонент, независимо от того, имеет он родителя или нет. Выводится оно с рамкой и заголовком (меньшим по высоте, чем у обычного окна), но без кнопок. Изменить размеры окна с помощью мыши нельзя;
ForeignWindow
— указывает, что окно создано другим процессом;
CoverWindow
— окно, представляющее минимизированное приложение на некоторых мобильных платформах.
Получить тип окна в программе позволяет метод windowType()
Для окон верхнего уровня можно через оператор
|
дополнительно указать следующие атри- буты из класса
QtCore.Qt
(здесь упомянуты только наиболее часто используемые атрибуты, полный их список ищите в документации):
MSWindowsFixedSizeDialogHint
— запрещает изменение размеров окна. Кнопка Развер- нуть в заголовке окна становится неактивной;
FramelessWindowHint
— убирает рамку и заголовок окна. Изменять размеры окна и пе- ремещать его нельзя;
NoDropShadowWindowHint
— убирает отбрасываемую окном тень;
CustomizeWindowHint
— убирает рамку и заголовок окна, но добавляет эффект объемно- сти. Размеры окна можно изменять;
WindowTitleHint
— добавляет заголовок окна. Выведем для примера окно фиксирован- ного размера с заголовком, в котором находится только текст: window.setWindowFlags(QtCore.Qt.Window |
QtCore.Qt.FramelessWindowHint |
QtCore.Qt.WindowTitleHint)
WindowSystemMenuHint
— добавляет оконное меню и кнопку Закрыть;
Глава 18. Управление окном приложения
365
WindowMinimizeButtonHint
— добавляет в заголовок кнопку Свернуть;
WindowMaximizeButtonHint
— добавляет в заголовок кнопку Развернуть;
WindowMinMaxButtonsHint
— добавляет в заголовок кнопки Свернуть и Развернуть;
WindowCloseButtonHint
— добавляет кнопку Закрыть;
WindowContextHelpButtonHint
— добавляет кнопку Справка;
WindowStaysOnTopHint
— сообщает системе, что окно всегда должно отображаться по- верх всех других окон;
WindowStaysOnBottomHint
— сообщает системе, что окно всегда должно быть располо- жено позади всех других окон.
Получить все установленные флаги из программы позволяет метод windowFlags()
18.3. Изменение и получение размеров окна
Для изменения размеров окна предназначены следующие методы:
resize(<Ширина>, <Высота>)
— изменяет текущий размер окна. Если содержимое окна не помещается в установленный размер, то размер будет выбран так, чтобы компоненты поместились без искажения при условии, что используются менеджеры геометрии. Сле- довательно, заданный размер может не соответствовать реальному размеру окна. Если используется абсолютное позиционирование, компоненты могут оказаться наполовину или полностью за пределами видимой части окна. В качестве параметра можно также указать экземпляр класса
QSize из модуля
QtCore
: window.resize(100, 70) window.resize(QtCore.QSize(100, 70))
setGeometry(
— изменяет одновременно положение компонента и его текущий размер. Первые два параметра задают координаты левого верхнего угла (относительно родительского компонента), а третий и четвертый парамет- ры — ширину и высоту. В качестве параметра можно также указать экземпляр класса
QRect из модуля
QtCore
: window.setGeometry(100, 100, 100, 70) window.setGeometry(QtCore.QRect(100, 100, 100, 70))
setFixedSize(<Ширина>, <Высота>)
— задает фиксированный размер. Изменить размеры окна с помощью мыши нельзя. Кнопка Развернуть в заголовке окна становится неак- тивной. В качестве параметра можно также указать экземпляр класса
QSize
: window.setFixedSize(100, 70) window.setFixedSize(QtCore.QSize(100, 70))
setFixedWidth(<Ширина>)
— задает фиксированный размер только по ширине. Изменить ширину окна с помощью мыши нельзя;
setFixedHeight(<Высота>)
— задает фиксированный размер только по высоте. Изменить высоту окна с помощью мыши нельзя;
setMinimumSize(<Ширина>, <Высота>)
— задает минимальные размеры окна. В качестве параметра можно также указать экземпляр класса
QSize
: window.setMinimumSize(100, 70) window.setMinimumSize(QtCore.QSize(100, 70))