Шаг 4.
Библиотека PyQt5.
Знакомство с PyQt5. ООП-стиль создания окна

    На этом шаге мы рассмотрим особенности создания окна в стиле ООП.

    Библиотека PyQt написана в объектно-ориентированном стиле (ООП-стиле) и содержит несколько сотен классов. Иерархия наследования всех классов имеет слишком большой размер. Тем не менее, чтобы показать зависимости, при описании компонентов иерархия наследования конкретного класса будет показываться. В качестве примера выведем базовые классы класса QWidget:

>>> from PyQt5 import QtWidgets
>>> QtWidgets.QWidget.__bases__
(<class 'PyQt5.QtCore.QObject'>, <class 'PyQt5.QtGui.QPaintDevice'>)

    Как видно из примера, класс QWidget наследует два класса: QObject и QPaintDevice. Класс QObject является классом верхнего уровня, и его в PyQt наследуют большинство классов. В свою очередь, класс QWidget является базовым классом для всех визуальных компонентов.


   Замечание. В описании каждого класса PyQt приводится описание лишь атрибутов, методов, сигналов и слотов, определенных непосредственно в описываемом классе. Атрибуты, методы, сигналы и слоты базовых классов там не описываются - присутствуют лишь ссылки на соответствующие страницы документации.

    В своих программах вы можете наследовать стандартные классы и добавлять новую функциональность. В качестве примера переделаем соответствующим образом код из 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):
определяет конструктор класса. В качестве параметров он принимает ссылки на экземпляр класса (self) и на родительский компонент (parent). Родительский компонент может отсутствовать, поэтому в определении конструктора параметру присваивается значение по умолчанию (None). Внутри метода __init__() вызывается конструктор базового класса, и ему передается ссылка на родительский компонент:
  QtWidgets.QWidget.__init__(self, parent)

    Следующие выражения внутри конструктора создают объекты надписи, кнопки и контейнера, затем добавляют компоненты в контейнер, а сам контейнер - в основное окно. Следует обратить внимание на то, что объекты надписи и кнопки сохраняются в атрибутах экземпляра класса. В дальнейшем из методов класса можно управлять этими объектами - например, изменять текст надписи. Если объекты не сохранить, то получить к ним доступ будет не так просто.

    В предыдущем примере (шаг 2) мы выравнивали надпись с помощью HTML-тегов. Осуществить такое выравнивание позволяет также метод setAlignment(), которому следует передать атрибут AlignHCenter из модуля QtCore:

  self.label.setAlignment(QtCore.Qt.AlignHCenter)

    В выражении, назначающем обработчик сигнала:

  self.btnQuit.clicked.connect(QtWidgets.qApp.quit)
мы получаем доступ к объекту приложения через рассмотренный ранее атрибут qApp модуля QtWidgets.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг