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

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


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница36 из 83
1   ...   32   33   34   35   36   37   38   39   ...   83
 move(, )
— задает положение компонента относительно родителя с учетом высо- ты заголовка и ширины границ. В качестве параметра можно также указать экземпляр класса
QPoint из модуля
QtCore
Пример вывода окна в левом верхнем углу экрана: window.move(0, 0) window.move(QtCore.QPoint(0, 0))

368
Часть II. Библиотека PyQt 5
 setGeometry(, , <Ширина>, <Высота>)
— изменяет одновременно положение компонента и его текущие размеры. Первые два параметра задают координаты левого верхнего угла относительно родительского компонента, а третий и четвертый парамет- ры — ширину и высоту. Обратите внимание, что метод не учитывает высоту заголовка и ширину границ, поэтому, если указать координаты
(0, 0)
, заголовок окна и левая гра- ница окажутся за пределами экрана. В качестве параметра можно также задать экземп- ляр класса
QRect из модуля
QtCore
: window.setGeometry(100, 100, 100, 70) window.setGeometry(QtCore.QRect(100, 100, 100, 70))
В
НИМАНИЕ
!
Начало координат расположено в левом верхнем углу. Положительная ось X направлена вправо, а положительная ось Y — вниз.
Получить позицию окна позволяют следующие методы:
 x()
и y()
— возвращают координаты левого верхнего угла окна относительно родителя по осям
X
и
Y
соответственно. Методы учитывают высоту заголовка и ширину границ: window.move(10, 10) print(window.x(), window.y()) # 10 10
 pos()
— возвращает экземпляр класса
QPoint
, содержащий координаты левого верхнего угла окна относительно родителя. Метод учитывает высоту заголовка и ширину границ: window.move(10, 10) print(window.pos().x(), window.pos().y()) # 10 10
 geometry()
— возвращает экземпляр класса
QRect
, содержащий координаты относитель- но родительского компонента. Метод не учитывает высоту заголовка и ширину границ: window.resize(300, 100) window.move(10, 10) rect = window.geometry() print(rect.left(), rect.top()) # 14 40 print(rect.width(), rect.height()) # 300 100
 frameGeometry()
— возвращает экземпляр класса
QRect
, содержащий координаты с уче- том высоты заголовка и ширины границ. Полные размеры окна доступны только после отображения окна: window.resize(300, 100) window.move(10, 10) rect = window.frameGeometry() print(rect.left(), rect.top()) # 10 10 print(rect.width(), rect.height()) # 308 134
Для отображения окна по центру экрана, у правой или нижней его границы необходимо знать размеры экрана. Для получения размеров экрана вначале следует вызвать статический метод
QApplication.desktop()
, который возвращает ссылку на компонент рабочего стола, представленный экземпляром класса
QDesktopWidget из модуля
QtWidgets
. Получить разме- ры экрана позволяют следующие методы этого класса:
 width()
— возвращает ширину всего экрана в пикселах;
 height()
— возвращает высоту всего экрана в пикселах.

Глава 18. Управление окном приложения
369
Примеры: desktop = QtGui.QApplication.desktop() print(desktop.width(), desktop.height()) # 1440 900
 screenGeometry()
— возвращает экземпляр класса
QRect
, содержащий координаты всего экрана: desktop = QtGui.QApplication.desktop() rect = desktop.screenGeometry() print(rect.left(), rect.top()) # 0 0 print(rect.width(), rect.height()) # 1440 900
 availableGeometry()
— возвращает экземпляр класса
QRect
, содержащий координаты только доступной части экрана (без размера панели задач): desktop = QtGui.QApplication.desktop() rect = desktop.availableGeometry() print(rect.left(), rect.top()) # 0 0 print(rect.width(), rect.height()) # 1440 818
Пример отображения окна приблизительно по центру экрана показан в листинге 18.2.
Листинг 18.2. Вывод окна приблизительно по центру экрана
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("Вывод окна по центру экрана") window.resize(300, 100) desktop = QtWidgets.QApplication.desktop() x = (desktop.width() - window.width()) // 2 y = (desktop.height() - window.height()) // 2 window.move(x, y) window.show() sys.exit(app.exec_())
В этом примере мы воспользовались методами width()
и height()
, которые не учитывают высоту заголовка и ширину границ. В большинстве случаев этого способа достаточно. Если же при выравнивании необходима точность, то для получения размеров окна можно вос- пользоваться методом frameSize()
. Однако этот метод возвращает корректные значения лишь после отображения окна. Если код выравнивания по центру расположить после вызо- ва метода show()
, окно вначале отобразится в одном месте экрана, а затем переместится в центр, что вызовет неприятное мелькание. Чтобы исключить такое мелькание, следует вначале отобразить окно за пределами экрана, а затем переместить его в центр экрана (лис- тинг 18.3).
Листинг 18.3. Вывод окна точно по центру экрана
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys

370
Часть II. Библиотека PyQt 5 app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("Вывод окна по центру экрана") window.resize(300, 100) window.move(window.width() * -2, 0) window.show() desktop = QtWidgets.QApplication.desktop() x = (desktop.width() - window.frameSize().width()) // 2 y = (desktop.height() - window.frameSize().height()) // 2 window.move(x, y) sys.exit(app.exec_())
Этот способ можно также использовать для выравнивания окна по правому краю экрана.
Например, чтобы расположить окно в правом верхнем углу экрана, необходимо заменить код из предыдущего примера, выравнивающий окно по центру, следующим кодом: desktop = QtWidgets.QApplication.desktop() x = desktop.width() - window.frameSize().width() window.move(x, 0)
Если попробовать вывести окно в правом нижнем углу, может возникнуть проблема, по- скольку в операционной системе Windows в нижней части экрана обычно располагается панель задач, и окно частично окажется под ней. Здесь нам пригодится метод availableGeometry()
, позволяющий получить высоту панели задач, расположенной в ниж- ней части экрана, следующим образом: desktop = QtWidgets.QApplication.desktop() taskBarHeight = (desktop.screenGeometry().height() - desktop.availableGeometry().height())
Следует также заметить, что в некоторых операционных системах панель задач допускается прикреплять к любой стороне экрана. Кроме того, экран может быть разделен на несколько рабочих столов. Все это необходимо учитывать при размещении окна (за более подробной информацией обращайтесь к документации по классу
QDesktopWidget
).
18.5. Указание координат и размеров
В двух предыдущих разделах были упомянуты классы
QPoint
,
QSize и
QRect
. Класс
QPoint описывает координаты точки, класс
QSize
— размеры, а класс
QRect
— координаты и раз- меры прямоугольной области. Все эти классы определены в модуле
QtCore
. Рассмотрим их более подробно.
П
РИМЕЧАНИЕ
Классы QPoint, QSize и QRect предназначены для работы с целыми числами. Чтобы рабо- тать с вещественными числами, необходимо использовать классы QPointF, QSizeF и
QRectF
соответственно. Эти классы также определены в модуле QtCore.
18.5.1. Класс QPoint: координаты точки
Класс
QPoint описывает координаты точки. Для создания экземпляра класса предназначены следующие форматы конструкторов:

Глава 18. Управление окном приложения
371
<Объект> = QPoint()
<Объект> = QPoint(, )
<Объект> = QPoint()
Первый конструктор создает экземпляр класса с нулевыми координатами:
>>> from PyQt5 import QtCore
>>> p = QtCore.QPoint()
>>> p.x(), p.y()
(0, 0)
Второй конструктор позволяет явно указать координаты точки:
>>> p = QtCore.QPoint(10, 88)
>>> p.x(), p.y()
(10, 88)
Третий конструктор создает новый экземпляр на основе другого экземпляра:
>>> p = QtCore.QPoint(QtCore.QPoint(10, 88))
>>> p.x(), p.y()
(10, 88)
Через экземпляр класса доступны следующие методы:
 x()
и y()
— возвращают координаты по осям
X
и
Y
соответственно;
 setX()
и setY()
— задают координаты по осям
X
и
Y
соответственно;
 isNull()
— возвращает
True
, если координаты равны нулю, и
False
— в противном слу- чае:
>>> p = QtCore.QPoint()
>>> p.isNull()
True
>>> p.setX(10); p.setY(88)
>>> p.x(), p.y()
(10, 88)
 manhattanLength()
— возвращает сумму абсолютных значений координат:
>>> QtCore.QPoint(10, 88).manhattanLength()
98
Над двумя экземплярами класса
QPoint можно выполнять операции
+
,
+=
, – (минус),
-=
,
==
и
!=
. Для смены знака координат можно воспользоваться унарным оператором
-
. Кроме того, экземпляр класса
QPoint можно умножить или разделить на вещественное число (операто- рами
*
,
*=
,
/
и
/=
):
>>> p1 = QtCore.QPoint(10, 20); p2 = QtCore.QPoint(5, 9)
>>> p1 + p2, p1 — p2
(PyQt5.QtCore.QPoint(15, 29), PyQt5.QtCore.QPoint(5, 11))
>>> p1 * 2.5, p1 / 2.0
(PyQt5.QtCore.QPoint(25, 50), PyQt5.QtCore.QPoint(5, 10))
>>> -p1, p1 == p2, p1 != p2
(PyQt5.QtCore.QPoint(-10, -20), False, True)

372
Часть II. Библиотека PyQt 5 18.5.2. Класс QSize: размеры прямоугольной области
Класс
QSize описывает размеры прямоугольной области. Для создания экземпляра класса предназначены следующие форматы конструкторов:
<Объект> = QSize()
<Объект> = QSize(<Ширина>, <Высота>)
<Объект> = QSize()
Первый конструктор создает экземпляр класса с отрицательной шириной и высотой. Второй конструктор позволяет явно указать ширину и высоту. Третий конструктор создает новый экземпляр на основе другого экземпляра:
>>> from PyQt5 import QtCore
>>> s1=QtCore.QSize(); s2=QtCore.QSize(10, 55); s3=QtCore.QSize(s2)
>>> s1
PyQt5.QtCore.QSize(-1, -1)
>>> s2, s3
(PyQt5.QtCore.QSize(10, 55), PyQt5.QtCore.QSize(10, 55))
Через экземпляр класса доступны следующие методы:
 width()
и height()
— возвращают ширину и высоту соответственно;
 setWidth(<Ширина>)
и setHeight(<Высота>)
— задают ширину и высоту соответственно.
Примеры:
>>> s = QtCore.QSize()
>>> s.setWidth(10); s.setHeight(55)
>>> s.width(), s.height()
(10, 55)
 isNull()
— возвращает
True
, если ширина и высота равны нулю, и
False
— в противном случае;
 isValid()
— возвращает
True
, если ширина и высота больше или равны нулю, и
False
— в противном случае;
 isEmpty()
— возвращает
True
, если один параметр (ширина или высота) меньше или равен нулю, и
False
— в противном случае;
 scale()
— производит изменение размеров области в соответствии со значением пара- метра
<Тип преобразования>
. Метод изменяет текущий объект и ничего не возвращает.
Форматы метода: scale(, <Тип преобразования>) scale(<Ширина>, <Высота>, <Тип преобразования>)
В параметре
<Тип преобразования>
могут быть указаны следующие атрибуты из класса
QtCore.Qt
:

IgnoreAspectRatio

0
— свободно изменяет размеры без сохранения пропорций сторон;

KeepAspectRatio

1
— производится попытка масштабирования старой области внутри новой области без нарушения пропорций;

KeepAspectRatioByExpanding

2
— производится попытка полностью заполнить но- вую область без нарушения пропорций старой области.

Глава 18. Управление окном приложения
373
Если новая ширина или высота имеет значение
0
, размеры изменяются непосредственно без сохранения пропорций, вне зависимости от значения параметра
<Тип преобразова- ния>
Примеры:
>>> s = QtCore.QSize(50, 20)
>>> s.scale(70, 60, QtCore.Qt.IgnoreAspectRatio); s
PyQt5.QtCore.QSize(70, 60)
>>> s = QtCore.QSize(50, 20)
>>> s.scale(70, 60, QtCore.Qt.KeepAspectRatio); s
PyQt5.QtCore.QSize(70, 28)
>>> s = QtCore.QSize(50, 20)
>>> s.scale(70, 60, QtCore.Qt.KeepAspectRatioByExpanding); s
PyQt5.QtCore.QSize(150, 60)
 scaled()
— то же самое, что scale()
, но не изменяет сам объект, а возвращает новый экземпляр класса
QSize
, хранящий измененные размеры:
>>> s1 = QtCore.QSize(50, 20)
>>> s2 = s1.scaled(70, 60, QtCore.Qt.IgnoreAspectRatio)
>>> s1, s2
(PyQt5.QtCore.QSize(50, 20), PyQt5.QtCore.QSize(70, 60))
 boundedTo()
— возвращает экземпляр класса
QSize
, который содержит мини- мальную ширину и высоту из текущих размеров и размеров, указанных в параметре:
>>> s = QtCore.QSize(50, 20)
>>> s.boundedTo(QtCore.QSize(400, 5))
PyQt5.QtCore.QSize(50, 5)
>>> s.boundedTo(QtCore.QSize(40, 50))
PyQt5.QtCore.QSize(40, 20)
 expandedTo()
— возвращает экземпляр класса
QSize
, который содержит макси- мальную ширину и высоту из текущих размеров и размеров, указанных в параметре:
>>> s = QtCore.QSize(50, 20)
>>> s.expandedTo(QtCore.QSize(400, 5))
PyQt5.QtCore.QSize(400, 20)
>>> s.expandedTo(QtCore.QSize(40, 50))
PyQt5.QtCore.QSize(50, 50)
 transpose()
— меняет значения местами. Метод изменяет текущий объект и ничего не возвращает:
>>> s = QtCore.QSize(50, 20)
>>> s.transpose(); s
PyQt5.QtCore.QSize(20, 50)
 transposed()
— то же самое, что transpose()
, но не изменяет сам объект, а возвращает новый экземпляр класса
QSize с измененными размерами:
>>> s1 = QtCore.QSize(50, 20)
>>> s2 = s1.transposed()
>>> s1, s2
(PyQt5.QtCore.QSize(50, 20), PyQt5.QtCore.QSize(20, 50))

374
Часть II. Библиотека PyQt 5
Над двумя экземплярами класса
QSize можно выполнять операции
+
,
+=
, – (минус),
-=
,
==
и
!=
. Кроме того, экземпляр класса
QSize можно умножить или разделить на вещественное число (операторами
*
,
*=
,
/
и
/=
):
>>> s1 = QtCore.QSize(50, 20); s2 = QtCore.QSize(10, 5)
>>> s1 + s2, s1 — s2
(PyQt5.QtCore.QSize(60, 25), PyQt5.QtCore.QSize(40, 15))
>>> s1 * 2.5, s1 / 2
(PyQt5.QtCore.QSize(125, 50), PyQt5.QtCore.QSize(25, 10))
>>> s1 == s2, s1 != s2
(False, True)
18.5.3. Класс QRect: координаты и размеры прямоугольной области
Класс
QRect описывает координаты и размеры прямоугольной области. Для создания экзем- пляра класса предназначены следующие форматы конструктора:
<Объект> = QRect()
<Объект> = QRect(, , <Ширина>, <Высота>)
<Объект> = QRect(<Координаты левого верхнего угла>, <Размеры>)
<Объект> = QRect(<Координаты левого верхнего угла>,
<Координаты правого нижнего угла>)
<Объект> = QRect()
Первый конструктор создает экземпляр класса со значениями по умолчанию. Второй и тре- тий конструкторы позволяют указать координаты левого верхнего угла и размеры области.
Во втором конструкторе значения указываются отдельно. В третьем конструкторе коорди- наты задаются с помощью класса
QPoint
, а размеры — с помощью класса
QSize
. Четвертый конструктор позволяет указать координаты левого верхнего угла и правого нижнего угла.
В качестве значений указываются экземпляры класса
QPoint
. Пятый конструктор создает новый экземпляр на основе другого экземпляра.
Примеры:
>>> from PyQt5 import QtCore
>>> r = QtCore.QRect()
>>> r.left(), r.top(), r.right(), r.bottom(), r.width(), r.height()
(0, 0, -1, -1, 0, 0)
>>> r = QtCore.QRect(10, 15, 400, 300)
>>> r.left(), r.top(), r.right(), r.bottom(), r.width(), r.height()
(10, 15, 409, 314, 400, 300)
>>> r = QtCore.QRect(QtCore.QPoint(10, 15), QtCore.QSize(400, 300))
>>> r.left(), r.top(), r.right(), r.bottom(), r.width(), r.height()
(10, 15, 409, 314, 400, 300)
>>> r = QtCore.QRect(QtCore.QPoint(10, 15), QtCore.QPoint(409, 314))
>>> r.left(), r.top(), r.right(), r.bottom(), r.width(), r.height()
(10, 15, 409, 314, 400, 300)
>>> QtCore.QRect(r)
PyQt5.QtCore.QRect(10, 15, 400, 300)
Изменить значения уже после создания экземпляра позволяют следующие методы:
 setLeft()
, setX()
, setTop()
и setY()
— задают координаты левого верхнего угла по осям
X
и
Y
:

Глава 18. Управление окном приложения
375
>>> r = QtCore.QRect()
>>> r.setLeft(10); r.setTop(55); r
PyQt5.QtCore.QRect(10, 55, -10, -55)
>>> r.setX(12); r.setY(81); r
PyQt5.QtCore.QRect(12, 81, -12, -81)
 setRight()
и setBottom()
— задают координаты правого нижнего угла по осям
X
и
Y
:
>>> r = QtCore.QRect()
>>> r.setRight(12); r.setBottom(81); r
PyQt5.QtCore.QRect(0, 0, 13, 82)
 setTopLeft()
— задает координаты левого верхнего угла;
 setTopRight()
— задает координаты правого верхнего угла;
 setBottomLeft()
— задает координаты левого нижнего угла;
 setBottomRight()
— задает координаты правого нижнего угла.
Примеры:
>>> r = QtCore.QRect()
>>> r.setTopLeft(QtCore.QPoint(10, 5))
>>> r.setBottomRight(QtCore.QPoint(39, 19)); r
PyQt5.QtCore.QRect(10, 5, 30, 15)
>>> r.setTopRight(QtCore.QPoint(39, 5))
>>> r.setBottomLeft(QtCore.QPoint(10, 19)); r
PyQt5.QtCore.QRect(10, 5, 30, 15)
 setWidth(<Ширина>)
, setHeight(<Высота>)
и setSize()
— задают ширину и высо- ту области;
 setRect(, , <Ширина>, <Высота>)
— задает координаты левого верхнего угла и размеры области;
 setCoords(, , , )
— задает координаты левого верхнего и правого нижнего углов.
Примеры:
>>> r = QtCore.QRect()
>>> r.setRect(10, 10, 100, 500); r
PyQt5.QtCore.QRect(10, 10, 100, 500)
>>> r.setCoords(10, 10, 109, 509); r
PyQt5.QtCore.QRect(10, 10, 100, 500)
 marginsAdded()
— возвращает новый экземпляр класса
QRect
, который пред- ставляет текущую область, увеличенную на заданные величины границ. Эти границы указываются в виде экземпляра класса
1   ...   32   33   34   35   36   37   38   39   ...   83


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