ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
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( В параметре <Тип преобразования> могут быть указаны следующие атрибуты из класса 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 , который пред- ставляет текущую область, увеличенную на заданные величины границ. Эти границы указываются в виде экземпляра класса |