반응형

아래 글을 참고합니다.

https://stackoverflow.com/questions/56806987/switch-button-in-pyqt

 

라디오 박스나 콤보 박스는 있는데 왜 스위치는 없지.. 하다가 찾았다.

 

위에 참고한 예제에 Diasble 기능을 추가했다.

참고로 Resize는 안된다.

 

결과물

Test 로 구현한 내용은 다음과 같다.

On 되어 있으면 초록색으로

Off 되어 있으면 빨간색으로

못쓰면 까만색으로 바꿨다.


 

코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# https://stackoverflow.com/questions/56806987/switch-button-in-pyqt
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QRect
import sys
class ColorSwitch(QtWidgets.QPushButton):
    def __init__(self, parent = None):
        super().__init__(parent)
        # print('init')
        self.setCheckable(True)
        self.setMinimumWidth(66)
        self.setMinimumHeight(22)
 
    def paintEvent(self, event):
        # On/Off Setting
        label = "ON" if self.isChecked() else "OFF"
        bg_color = Qt.green if self.isChecked() else Qt.red
        pen_color = Qt.black
 
        radius = 10
        width = 32
        center = self.rect().center()
        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.translate(center)
        painter.setBrush(QtGui.QColor(0,0,0))
 
        # Enable이 아니면 색을 바꾼다.
        if not self.isEnabled():
            bg_color = Qt.black
            pen_color = Qt.white
        
        # Switch Background
        sw_bg = QRect(-width, -radius, 2*width, 2*radius)
        painter.drawRoundedRect(sw_bg, radius, radius)
        painter.setBrush(QtGui.QBrush(bg_color))
 
        pen = QtGui.QPen(pen_color)
        pen.setWidth(2)
        painter.setPen(pen)
 
        if not self.isEnabled():
            painter.drawText(sw_bg, Qt.AlignCenter, "DISABLE")
        else:
            # Switch Reaction
            sw_rect = QRect(-radius, -radius, width + radius, 2*radius)
            if not self.isChecked():
                sw_rect.moveLeft(-width)
            painter.drawRoundedRect(sw_rect, radius, radius)
            painter.drawText(sw_rect, Qt.AlignCenter, label)
 
# Test Code
class Test(QMainWindow):
    def __init__(self):
        super().__init__()
        parent = self
        button = ColorSwitch(parent=parent)
        button.toggle()
        button.move(2020)
        button = ColorSwitch(parent=parent)
        button.move(2070)
        button = ColorSwitch(parent=parent)
        button.setEnabled(False)
        button.move(20120)
 
        self.setGeometry(100100150200)
        self.show()
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Test()
    sys.exit(app.exec_())
cs

 

Reference

[1] "Switch button in pyqt", https://stackoverflow.com/questions/56806987/switch-button-in-pyqt

 

EOF

728x90

+ Recent posts