반응형
아래 글을 참고합니다.
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(20, 20)
button = ColorSwitch(parent=parent)
button.move(20, 70)
button = ColorSwitch(parent=parent)
button.setEnabled(False)
button.move(20, 120)
self.setGeometry(100, 100, 150, 200)
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
'SW' 카테고리의 다른 글
[PYTHON] 시간 간격을 알려주는 스탑워치 클래스 만들기 (0) | 2023.08.06 |
---|---|
[PyQt5] 새 창을 띄워서 matplotlib.animation으로 실시간 그래프 그리기 (0) | 2023.08.06 |
[PyQt5] QSlider and QProgressbar (0) | 2023.08.06 |
[PYTHON] CANable로 CAN 통신하기 - candle_driver (0) | 2023.08.06 |
[PyQt5] callback 함수에 인자로 함수 포인터와 값 전달하기 (0) | 2023.08.06 |