PySide6

Форк
0
/
4_powerbar_3_4.py 
119 строк · 8.0 Кб
1
"""
2
Пример создания пользовательского виджета.
3
4-ый шаг - интеграция механизма обновления дисплея согласно
4
положению вращающегося регулятора и отображения его значения
5
"""
6
import sys
7

8
from PySide6.QtWidgets import QApplication, QVBoxLayout, QDial, QWidget, QSizePolicy
9
from PySide6.QtGui import QPaintEvent, QPainter, QBrush, QColor
10
from 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

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

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

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

48
    def paintEvent(self, e: QPaintEvent) -> None:
49
        """
50
        Метод пользовательский обработчик события рисования
51
        :param e: QPaintEvent - событие базового обработчика рисования
52
        :return: None
53
        """
54
        painter = QPainter(self)  # создание экземпляра класса рисовальщика
55
        brush = QBrush()  # создание экземпляра класса кисти
56
        brush.setColor(QColor('black'))  # установка цвета кисти
57
        brush.setStyle(Qt.SolidPattern)  # установка стиля заполнения сплошное
58
        rect = QRect(0, 0, painter.device().width(), painter.device().height())
59
        # Рисование прямоугольника. Использование метода .device() позволяют рисовать
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
        pen = painter.pen()  # вызов метода создания пера рисовальщика
69
        pen.setColor(QColor('red'))  # установка цвета пера
70
        painter.setPen(pen)  # применение настроек пера к рисовальщику
71
        font = painter.font()  # вызов метода создания шрифта рисовальщика
72
        font.setFamily('Times')  # установка типа шрифта
73
        font.setPointSize(18)  # установка размера шрифта
74
        painter.setFont(font)  # применение настроек шрифта к рисовальщику
75
        painter.drawText(25, 25, f'{vmin}-->{value}-->{vmax}')  # вывод текста рисовальщиком
76
        painter.end()  # вызов метода завершения работы рисовальщика
77

78
    def _trigger_refresh(self):
79
        """
80
        Метод ресивер (слот) сигнала обновления виджета
81
        :return:
82
        """
83
        self.update()  # вызов метода обновления виджета родительского класса QWidget
84

85

86
class PowerBar(QWidget):
87
    """
88
    Подкласс пользовательского виджета от супер-класса базового виджета
89
    """
90

91
    def __init__(self, parent=None, steps: int = 5) -> None:
92
        """
93
        Конструктор пользовательского виджета
94
        """
95
        QWidget.__init__(self, parent)  # явный вызов конструктора родительского класса
96
        layout = QVBoxLayout()  # создание экземпляра класса слоев для виджетов
97
        self._bar = _Bar()  # создание экземпляра класса силовой шкалы
98
        layout.addWidget(self._bar)  # размещение силовой объекта силовой шкалы в слое
99
        self._dial = QDial()  # создание экземпляра класса виджета вращающегося регулятора
100
        self._dial.valueChanged.connect(self._bar._trigger_refresh)  # создание сигнала на изменение
101
        # положения регулятора
102
        layout.addWidget(self._dial)  # размещение виджета регулятора на слое
103
        self.setLayout(layout)  # размещение слоя с виджетами в окне пользовательского виджета
104

105

106
def main() -> None:
107
    """
108
    Функция запуска кода верхнего уроня
109
    :return: None
110
    """
111
    app = QApplication(sys.argv)  # создание экземпляра основного цикла главного окна приложения
112
    volume = PowerBar()  # создание экземпляра пользовательского виджета
113
    volume.show()  # вызов метода вывода виджета (по умолчанию виджет спрятан)
114
    app.exec()  # запуска основного цикла пользовательского виджета
115

116

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

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

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

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

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