在pyqt 中实现滑动按钮比较麻烦,需要自己绘制。
最麻烦的就是需要自己在布局控件的基础上对着绘制出的按钮以及文字进行大小位置的微调。
self.switchButton = SwitchButton()
self.verticalLayout.addWidget(self.switchButton) #todo 在qt里创建一个垂直布局
绘制滑动按钮的完整代码如下:
class SwitchButton(QWidget):
clicked = pyqtSignal(bool)
def __init__(self,):
super(SwitchButton, self).__init__()
# 开关状态,默认关闭
self.state = False
def mousePressEvent(self, event):
super(SwitchButton, self).mousePressEvent(event)
self.state = False if self.state else True
self.update()
self.clicked.emit(self.state)
def paintEvent(self, event):
super(SwitchButton, self).paintEvent(event)
# 创建绘制器并设置抗锯齿和图片流畅转换
painter = QPainter(self)
painter.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
# 定义字体样式
font = QFont('SimHei')
font.setPixelSize(20)
painter.setFont(font)
# 开关为开的状态
if self.state:
##todo 绘制外框方形
painter.setPen(Qt.NoPen)
brush_color = QColor('#ee7700')
painter.setBrush(QBrush(brush_color))
corner_radius = 10
painter.drawRoundedRect(0, 0, self.width(), self.height(), corner_radius, corner_radius) #设置矩形圆角
#todo 绘制内框方形
slider_size = self.height() - 6
slider_position = self.width() - slider_size - 3
painter.setBrush(QBrush(QColor('#ffffff')))
painter.drawRoundedRect(slider_position + 3, 9, slider_size - 10, slider_size - 10,
corner_radius - 5, corner_radius - 5)
# 绘制文本
painter.setPen(QPen(QColor('#ffffff')))
painter.setBrush(Qt.NoBrush)
painter.drawText(QRect(20, 16 ,60, 30), Qt.AlignLeft, '打开')
# 开关为关的状态
else:
##todo 绘制外框方形
painter.setPen(Qt.NoPen)
# brush_color = QColor('#fa6a07')
brush_color = QColor('#c8c8c8')
painter.setBrush(QBrush(brush_color))
corner_radius = 10 # Adjust the radius as needed
painter.drawRoundedRect(0, 0, self.width(), self.height(), corner_radius, corner_radius)
#todo 绘制内框方形
slider_size = self.height() - 6
slider_position = 3
painter.setBrush(QBrush(QColor('#747474')))
painter.drawRoundedRect(slider_position + 5, 9, slider_size - 10, slider_size - 10,
corner_radius - 5, corner_radius - 5)
# 绘制文本
painter.setPen(QPen(QColor('#000000')))
painter.setBrush(Qt.NoBrush)
painter.drawText(QRect(40, 16, 60, 30), Qt.AlignRight, '关闭')
效果如下图: