PySide6

Форк
0
/
6_powerbar_6.py 
132 строки · 9.2 Кб
1
"""
2
Пример создания пользовательского виджета.
3
6-ой шаг - отрисовка непосредственно делений шкалы
4
"""
5
import sys
6

7
from PySide6.QtWidgets import QApplication, QVBoxLayout, QDial, QWidget, QSizePolicy
8
from PySide6.QtGui import QPaintEvent, QPainter, QBrush, QColor
9
from PySide6.QtCore import Qt, QRect, QSize
10

11
"""
12
Модуль sys нужен для доступа к аргументам командной строки. Если использование аргументов
13
командной строки не предполагается, то импорт можно не выполнять. При этом, при создании
14
приложения в класс QApplication([]) в качестве аргумента передается пустой список.
15
Импорт из модуля PySide6.QtWidgets класса для управления приложением QApplication и класса слоев
16
для виджетов с вертикальной организацией QVBoxLayout, класса виджета вращающегося регулятора QDial,
17
класса базового виджета QWidget, класса политики изменения размера QSizePolicy.
18
Импорт из модуля PySide6.QtCore класса Qt,содержащего различные идентификаторы, используемые
19
в библиотеке Qt, класса примитива прямоугольника QRect. 
20
Импорт из модуля PySide6.QtGui класса обработчика событий рисования QPaintEvent, класса виджета
21
для рисования QPainter, класса кисти QBrush, класса объекта цветов QColor, класса размеров QSize.
22
Другие виджеты можно найти по ссылке https://doc.qt.io/qt-5/widget-classes.html#basic-widget-classes
23
"""
24

25

26
class _Bar(QWidget):
27
    """
28
    Подкласс силовой шкалы от супер-класса базового виджета
29
    """
30

31
    def __init__(self):
32
        """
33
        Конструктор шкалы измерителя
34
        """
35
        QWidget.__init__(self)  # Явный вызов конструктора родительского класса
36
        self.setSizePolicy(QSizePolicy.MinimumExpanding,
37
                           QSizePolicy.MinimumExpanding
38
                           )
39

40
    def sizeHint(self) -> QSize:
41
        """
42
        Метод, возвращающий минимальные размеры виджета
43
        :return: QSize - минимальный размер виджетов
44
        """
45
        return QSize(40, 120)
46

47
    def paintEvent(self, e: QPaintEvent) -> None:
48
        """
49
        Метод пользовательский обработчик события рисования
50
        :param e: QPaintEvent - событие базового обработчика рисования
51
        :return: None
52
        """
53
        painter = QPainter(self)  # создание экземпляра класса рисовальщика
54
        brush = QBrush()  # создание экземпляра класса кисти
55
        brush.setColor(QColor('black'))  # установка цвета кисти
56
        brush.setStyle(Qt.SolidPattern)  # установка стиля заполнения сплошное
57
        rect = QRect(0, 0, painter.device().width(), painter.device().height())
58
        # Рисование прямоугольника. Использование метода .device() позволяют рисовать
59
        # прямоугольник согласно размеру окна виджета. Методы .width() и height() извлекают
60
        # размеры окна рисовальщика
61
        painter.fillRect(rect, brush)  # заливка прямоугольника цветом кисти
62

63
        # Отображение текущего состояния
64
        dial = self.parent()._dial  # передача ссылки на регулятор в переменную через специальный
65
        # метод родительского класса
66
        vmin, vmax = dial.minimum(), dial.maximum()  # установка минимального и максимального значения регулятора
67
        value = dial.value()  # извлечение текущего значения регулятора
68

69
        pc = (value - vmin) / (vmax - vmin)  # вычисление доли шкалы, соответствующей значению регулятора
70
        n_steps_to_draw = int(pc * 5)  # вычисление количества сегментов, которые должны быть
71
        # отрисованы (всего 5 сегментов для значений от 0 (ничего) до 5)
72

73
        padding = 5  # установка величины отступов
74
        d_height = painter.device().height() - (padding * 2)  # вычисление высоты области рисования делений
75
        # шкалы с учетом отступов
76
        d_width = painter.device().width() - (padding * 2)  # вычисление ширины области рисования делений
77
        # шкалы с учетом отступов
78
        step_size = d_height / 5  # вычисление доли высоты на одно деление
79
        bar_height = step_size * 0.6  # вычисление высоты прямоугольника деления
80
        brush.setColor('red')  # установка цвета кисти для заливки
81
        for n in range(n_steps_to_draw):  # цикл отрисовки делений шаклы
82
            ypos = (1 + n) * step_size  # вычисление положения ЛВУ прямоугольника деления относительно самого деления
83
            rect = QRect(padding,  # отрисовка прямоугольника с вычисленными параметрами
84
                         padding + d_height - int(ypos),  # вычисление высоты ЛВУ прямоугольника деления на шкале
85
                         d_width,
86
                         int(bar_height)
87
                         )
88
            painter.fillRect(rect, brush)  # заливка прямоугольника деления шкалы цветом
89
        painter.end()  # метод завершения работы рисовальщика
90

91
    def _trigger_refresh(self):
92
        """
93
        Метод ресивер (слот) сигнала обновления виджета
94
        :return:
95
        """
96
        self.update()  # вызов метода обновления виджета родительского класса QWidget
97

98

99
class PowerBar(QWidget):
100
    """
101
    Подкласс пользовательского виджета от супер-класса базового виджета
102
    """
103

104
    def __init__(self, parent=None, steps: int = 5) -> None:
105
        """
106
        Конструктор пользовательского виджета
107
        """
108
        QWidget.__init__(self, parent)  # явный вызов конструктора родительского класса
109
        layout = QVBoxLayout()  # создание экземпляра класса слоев для виджетов
110
        self._bar = _Bar()  # создание экземпляра класса силовой шкалы
111
        layout.addWidget(self._bar)  # размещение силовой объекта силовой шкалы в слое
112
        self._dial = QDial()  # создание экземпляра класса виджета вращающегося регулятора
113
        self._dial.valueChanged.connect(self._bar._trigger_refresh)  # создание сигнала на изменение
114
        # положения регулятора
115
        layout.addWidget(self._dial)  # размещение виджета регулятора на слое
116
        self.setLayout(layout)  # размещение слоя с виджетами в окне пользовательского виджета
117

118

119
def main() -> None:
120
    """
121
    Функция запуска кода верхнего уроня
122
    :return: None
123
    """
124
    app = QApplication(sys.argv)  # создание экземпляра основного цикла главного окна приложения
125
    volume = PowerBar()  # создание экземпляра пользовательского виджета
126
    volume.show()  # вызов метода вывода виджета (по умолчанию виджет спрятан)
127
    app.exec()  # запуска основного цикла пользовательского виджета
128

129

130
if __name__ == '__main__':  # данное условие нужно для предотвращения запуска кода верхнего уровня при
131
    # импортировании данного файла как модуля
132
    main()  # вызов функции запуска кода верхнего
133

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.