На этом шаге мы рассмотрим алгоритмы, размещающие окно по центру.
Для отображения окна по центру экрана, а также у правой или нижней его границы, необходимо знать размеры экрана. Для получения размеров экрана вначале следует вызвать статический метод QApplication.desktop(), который возвращает ссылку на компонент рабочего стола, представленный экземпляром класса QDesktopWidget из модуля QtWidgets. Получить размеры экрана позволяют следующие методы этого класса:
desktop = QtGui.QApplication.desktop() print(desktop.width(), desktop.height()) # 1440 900
desktop = QtGui.QApplication.desktop() rect = desktop.screenGeometry() print (rect.left(), rect.top()) # 0 0 print (rect.width(), rect.height()) # 1440 900
desktop = QtGui.QApplication.desktop() rect = desktop.availableGeometry() print (rect.left(), rect.top()) # 0 0 print (rect.width(), rect.height()) # 1440 818
Приведем пример отображения окна приблизительно по центру экрана.
# -*- 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(), то окно отобразится вначале в одном месте экрана, а затем переместится в центр, что вызовет неприятное мелькание. Чтобы исключить такое мелькание, следует вначале отобразить окно за пределами экрана, а затем переместить его в центр экрана:
# Вывод окна точно по центру экрана # -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys 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).
На следующем шаге мы рассмотрим указание координат и размеров.