pyqt 中 自定义滑动按钮

本文详细介绍了如何在PyQt中实现一个可自定义大小和位置的滑动按钮,涉及了`SwitchButton`类的创建、鼠标事件处理和使用QPainter进行图形绘制的过程。
摘要由CSDN通过智能技术生成

 在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, '关闭')








效果如下图:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值