PySide6
119 строк · 8.0 Кб
1"""
2Пример создания пользовательского виджета.
34-ый шаг - интеграция механизма обновления дисплея согласно
4положению вращающегося регулятора и отображения его значения
5"""
6import sys
7
8from PySide6.QtWidgets import QApplication, QVBoxLayout, QDial, QWidget, QSizePolicy
9from PySide6.QtGui import QPaintEvent, QPainter, QBrush, QColor
10from PySide6.QtCore import Qt, QRect, QSize
11
12"""
13Модуль sys нужен для доступа к аргументам командной строки. Если использование аргументов
14командной строки не предполагается, то импорт можно не выполнять. При этом, при создании
15приложения в класс QApplication([]) в качестве аргумента передается пустой список.
16Импорт из модуля PySide6.QtWidgets класса для управления приложением QApplication и класса слоев
17для виджетов с вертикальной организацией QVBoxLayout, класса виджета вращающегося регулятора QDial,
18класса базового виджета QWidget, класса политики изменения размера QSizePolicy.
19Импорт из модуля PySide6.QtCore класса Qt,содержащего различные идентификаторы, используемые
20в библиотеке Qt, класса примитива прямоугольника QRect.
21Импорт из модуля PySide6.QtGui класса обработчика событий рисования QPaintEvent, класса виджета
22для рисования QPainter, класса кисти QBrush, класса объекта цветов QColor, класса размеров QSize.
23Другие виджеты можно найти по ссылке https://doc.qt.io/qt-5/widget-classes.html#basic-widget-classes
24"""
25
26
27class _Bar(QWidget):
28"""
29Подкласс силовой шкалы от супер-класса базового виджета
30"""
31
32def __init__(self):
33"""
34Конструктор шкалы измерителя
35"""
36QWidget.__init__(self) # Явный вызов конструктора родительского класса
37self.setSizePolicy(QSizePolicy.MinimumExpanding,
38QSizePolicy.MinimumExpanding
39)
40
41def sizeHint(self) -> QSize:
42"""
43Метод, возвращающий минимальные размеры виджета
44:return: QSize - минимальный размер виджетов
45"""
46return QSize(40, 120)
47
48def paintEvent(self, e: QPaintEvent) -> None:
49"""
50Метод пользовательский обработчик события рисования
51:param e: QPaintEvent - событие базового обработчика рисования
52:return: None
53"""
54painter = QPainter(self) # создание экземпляра класса рисовальщика
55brush = QBrush() # создание экземпляра класса кисти
56brush.setColor(QColor('black')) # установка цвета кисти
57brush.setStyle(Qt.SolidPattern) # установка стиля заполнения сплошное
58rect = QRect(0, 0, painter.device().width(), painter.device().height())
59# Рисование прямоугольника. Использование метода .device() позволяют рисовать
60# прямоугольник согласно размеру окна виджета
61painter.fillRect(rect, brush) # заливка прямоугольника цветом кисти
62
63# Отображение текущего состояния
64dial = self.parent()._dial # передача ссылки на регулятор в переменную через специальный
65# метод родительского класса
66vmin, vmax = dial.minimum(), dial.maximum() # установка минимального и максимального значения регулятора
67value = dial.value() # извлечение текущего значения регулятора
68pen = painter.pen() # вызов метода создания пера рисовальщика
69pen.setColor(QColor('red')) # установка цвета пера
70painter.setPen(pen) # применение настроек пера к рисовальщику
71font = painter.font() # вызов метода создания шрифта рисовальщика
72font.setFamily('Times') # установка типа шрифта
73font.setPointSize(18) # установка размера шрифта
74painter.setFont(font) # применение настроек шрифта к рисовальщику
75painter.drawText(25, 25, f'{vmin}-->{value}-->{vmax}') # вывод текста рисовальщиком
76painter.end() # вызов метода завершения работы рисовальщика
77
78def _trigger_refresh(self):
79"""
80Метод ресивер (слот) сигнала обновления виджета
81:return:
82"""
83self.update() # вызов метода обновления виджета родительского класса QWidget
84
85
86class PowerBar(QWidget):
87"""
88Подкласс пользовательского виджета от супер-класса базового виджета
89"""
90
91def __init__(self, parent=None, steps: int = 5) -> None:
92"""
93Конструктор пользовательского виджета
94"""
95QWidget.__init__(self, parent) # явный вызов конструктора родительского класса
96layout = QVBoxLayout() # создание экземпляра класса слоев для виджетов
97self._bar = _Bar() # создание экземпляра класса силовой шкалы
98layout.addWidget(self._bar) # размещение силовой объекта силовой шкалы в слое
99self._dial = QDial() # создание экземпляра класса виджета вращающегося регулятора
100self._dial.valueChanged.connect(self._bar._trigger_refresh) # создание сигнала на изменение
101# положения регулятора
102layout.addWidget(self._dial) # размещение виджета регулятора на слое
103self.setLayout(layout) # размещение слоя с виджетами в окне пользовательского виджета
104
105
106def main() -> None:
107"""
108Функция запуска кода верхнего уроня
109:return: None
110"""
111app = QApplication(sys.argv) # создание экземпляра основного цикла главного окна приложения
112volume = PowerBar() # создание экземпляра пользовательского виджета
113volume.show() # вызов метода вывода виджета (по умолчанию виджет спрятан)
114app.exec() # запуска основного цикла пользовательского виджета
115
116
117if __name__ == '__main__': # данное условие нужно для предотвращения запуска кода верхнего уровня при
118# импортировании данного файла как модуля
119main() # вызов функции запуска кода верхнего
120