На этом шаге мы рассмотрим особенности создания окна в стиле ООП.
Библиотека PyQt написана в объектно-ориентированном стиле (ООП-стиле) и содержит несколько сотен классов. Иерархия наследования всех классов имеет слишком большой размер. Тем не менее, чтобы показать зависимости, при описании компонентов иерархия наследования конкретного класса будет показываться. В качестве примера выведем базовые классы класса QWidget:
>>> from PyQt5 import QtWidgets >>> QtWidgets.QWidget.__bases__ (<class 'PyQt5.QtCore.QObject'>, <class 'PyQt5.QtGui.QPaintDevice'>)
Как видно из примера, класс QWidget наследует два класса: QObject и QPaintDevice. Класс QObject является классом верхнего уровня, и его в PyQt наследуют большинство классов. В свою очередь, класс QWidget является базовым классом для всех визуальных компонентов.
В своих программах вы можете наследовать стандартные классы и добавлять новую функциональность. В качестве примера переделаем соответствующим образом код из 2 шага и создадим окно в ООП-стиле.
# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtWidgets class MyWindow(QtWidgets.QWidget): def __init__ (self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.label = QtWidgets.QLabel("Привет, мир!") self.label.setAlignment(QtCore.Qt.AlignHCenter) self.btnQuit = QtWidgets.QPushButton ("&Закрыть окно") self.vbox = QtWidgets.QVBoxLayout() self.vbox.addWidget(self.label) self.vbox.addWidget(self.btnQuit) self.setLayout(self.vbox) self.btnQuit.clicked.connect(QtWidgets.qApp.quit) if __name__ == "__main__" : import sys app = QtWidgets.QApplication(sys.argv) window = MyWindow() # Создаем экземпляр класса window.setWindowTitle("ООП-стиль создания окна") window.resize(300, 70) window.show() # Отображаем окно sys.exit(app.exec_())# Запускаем цикл обработки событий
В первых двух строках кода, как обычно, указывается кодировка файла и подключаются необходимые модули. На этот раз, помимо уже знакомого модуля QtWidgets, нам понадобится модуль QtCore, в котором объявлены атрибуты, задающие, в том числе, и режим выравнивания текста в объекте надписи.
Далее мы определяем класс MyWindow, который наследует класс QWidget:
class MyWindow(QtWidgets.QWidget):
Помимо класса QWidget, можно наследовать и другие классы, являющиеся его наследниками, - например, QFrame (окно с рамкой) или QDialog (диалоговое окно). При наследовании класса QDialog окно будет выравниваться по центру экрана (или по центру родительского окна) и иметь в заголовке окна только две кнопки: Справка и Закрыть. Кроме того, можно наследовать класс QMainWindow, который представляет главное окно приложения с меню, панелями инструментов и строкой состояния. Наследование класса QMainWindow имеет свои отличия, которые мы рассмотрим позже.
Выражение:
def __init__ (self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
Следующие выражения внутри конструктора создают объекты надписи, кнопки и контейнера, затем добавляют компоненты в контейнер, а сам контейнер - в основное окно. Следует обратить внимание на то, что объекты надписи и кнопки сохраняются в атрибутах экземпляра класса. В дальнейшем из методов класса можно управлять этими объектами - например, изменять текст надписи. Если объекты не сохранить, то получить к ним доступ будет не так просто.
В предыдущем примере (шаг 2) мы выравнивали надпись с помощью HTML-тегов. Осуществить такое выравнивание позволяет также метод setAlignment(), которому следует передать атрибут AlignHCenter из модуля QtCore:
self.label.setAlignment(QtCore.Qt.AlignHCenter)
В выражении, назначающем обработчик сигнала:
self.btnQuit.clicked.connect(QtWidgets.qApp.quit)
На следующем шаге мы закончим изучение этого вопроса.