Главная страница

ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница35 из 83
1   ...   31   32   33   34   35   36   37   38   ...   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))

366
Часть II. Библиотека PyQt 5
 setMinimumWidth(<Ширина>)
и setMinimumHeight(<Высота>)
— задают минимальную ши- рину и высоту соответственно;
 setMaximumSize(<Ширина>, <Высота>)
— задает максимальный размер окна. В качестве параметра можно также указать экземпляр класса
QSize
: window.setMaximumSize(100, 70) window.setMaximumSize(QtCore.QSize(100, 70))
 setMaximumWidth(<Ширина>)
и setMaximumHeight(<Высота>)
— задают максимальную ши- рину и высоту соответственно;
 setBaseSize(<Ширина>, <Высота>)
— задает базовые размеры. В качестве параметра можно также указать экземпляр класса
QSize
: window.setBaseSize(500, 500) window.setBaseSize(QtCore.QSize(500, 500))
 adjustSize()
— подгоняет размеры компонента под содержимое. При этом учитываются рекомендуемые размеры, возвращаемые методом sizeHint()
Получить размеры позволяют следующие методы:
 width()
и height()
— возвращают текущую ширину и высоту соответственно: window.resize(50, 70) print(window.width(), window.height()) # 50 70
 size()
— возвращает экземпляр класса
QSize
, содержащий текущие размеры: window.resize(50, 70) print(window.size().width(), window.size().height()) # 50 70
 minimumSize()
— возвращает экземпляр класса
QSize
, содержащий минимальные размеры;
 minimumWidth()
и minimumHeight()
— возвращают минимальную ширину и высоту соот- ветственно;
 maximumSize()
— возвращает экземпляр класса
QSize
, содержащий максимальные размеры;
 maximumWidth()
и maximumHeight()
— возвращают максимальную ширину и высоту соот- ветственно;
 baseSize()
— возвращает экземпляр класса
QSize
, содержащий базовые размеры;
 sizeHint()
— возвращает экземпляр класса
QSize
, содержащий рекомендуемые размеры компонента. Если таковые являются отрицательными, считается, что нет рекомендуемо- го размера;
 minimumSizeHint()
— возвращает экземпляр класса
QSize
, содержащий рекомендуемый минимальный размер компонента. Если возвращаемые размеры являются отрицатель- ными, то считается, что нет рекомендуемого минимального размера;
 rect()
— возвращает экземпляр класса
QRect
, содержащий координаты и размеры пря- моугольника, в который вписан компонент: window.setGeometry(QtCore.QRect(100, 100, 100, 70)) rect = window.rect() print(rect.left(), rect.top()) # 0 0 print(rect.width(), rect.height()) # 100 70
 geometry()
— возвращает экземпляр класса
QRect
, содержащий координаты относитель- но родительского компонента:

Глава 18. Управление окном приложения
367 window.setGeometry(QtCore.QRect(100, 100, 100, 70)) rect = window.geometry() print(rect.left(), rect.top()) # 100 100 print(rect.width(), rect.height()) # 100 70
При изменении и получении размеров окна следует учитывать, что:
 размеры не включают высоту заголовка окна и ширину границ;
 размер компонентов может изменяться в зависимости от настроек стиля. Например, на разных компьютерах может быть задан шрифт разного наименования и размера, поэтому от указания фиксированных размеров лучше отказаться;
 размер окна может изменяться в промежутке между получением значения и действиями, выполняющими обработку этих значений в программе. Например, сразу после получе- ния размера пользователь может изменить размеры окна с помощью мыши.
Чтобы получить размеры окна, включающие высоту заголовка и ширину границ, следует воспользоваться методом frameSize()
, который возвращает экземпляр класса
QSize
. Обра- тите внимание, что полные размеры окна доступны только после его отображения, — до этого момента они совпадают с размерами клиентской области окна, без учета высоты заго- ловка и ширины границ. Пример получения полного размера окна: window.resize(200, 70) # Задаем размеры
# ... window.show() # Отображаем окно print(window.width(), window.height()) # 200 70 print(window.frameSize().width(), window.frameSize().height()) # 208 104
Чтобы получить координаты окна с учетом высоты заголовка и ширины границ, следует воспользоваться методом frameGeometry()
. И в этом случае полные размеры окна доступны только после отображения окна. Метод возвращает экземпляр класса
QRect
: window.setGeometry(100, 100, 200, 70)
# ... window.show() # Отображаем окно rect = window.geometry() print(rect.left(), rect.top()) # 100 100 print(rect.width(), rect.height()) # 200 70 rect = window.frameGeometry() print(rect.left(), rect.top()) # 96 70 print(rect.width(), rect.height()) # 208 104 18.4. Местоположение окна на экране и управление им
Задать местоположение окна на экране монитора позволяют следующие методы:
1   ...   31   32   33   34   35   36   37   38   ...   83


написать администратору сайта