📌  相关文章
📜  PyQt5 - 单选按钮的胶囊形指示器(1)

📅  最后修改于: 2023-12-03 15:18:46.625000             🧑  作者: Mango

PyQt5 - 单选按钮的胶囊形指示器

介绍

在PyQt5中,我们可以使用单选按钮(QRadioButton)来进行单项选择,但是默认情况下,单选按钮的指示器为圆形,无法满足所有的设计需求。本文将介绍如何在PyQt5中实现单选按钮的胶囊形指示器。

原理

单选按钮默认的指示器为圆形,我们需要通过自定义QAbstractButton的paintEvent方法来绘制胶囊形的指示器。具体的步骤为:

  1. 调用QStyle的subControlRect获取指示器的矩形区域。

  2. 在指示器矩形区域内绘制胶囊形。

  3. 根据按钮状态和用户设定来绘制指示器内部的选中状态。

代码
import sys
from PyQt5.QtWidgets import QApplication, QRadioButton, QWidget
from PyQt5.QtCore import QRect, Qt
from PyQt5.QtGui import QPainter, QColor, QBrush, QFont

class CapsuleRadioButton(QRadioButton):
    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.checked_color = QColor(255, 199, 44)
        self.unchecked_color = QColor(163, 163, 163)
        self.font = QFont('Arial', 11)
        
    def paintEvent(self, e):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        
        # 获取指示器矩形区域,通过样式绘制获取边框矩形
        option = self.initStyleOption()
        rect = self.style().subControlRect(self.style().CC_RadioButton, option, self)
        border_rect = QRect(rect.x(), rect.y(), rect.height(), rect.height())
        
        # 绘制胶囊形
        capsule_rect = QRect(rect.x()+2, rect.y()+2, rect.height()-4, rect.height()-4)
        painter.setPen(Qt.NoPen)
        painter.setBrush(QBrush(self.checked_color if self.isChecked() else self.unchecked_color))
        painter.drawRoundedRect(capsule_rect, 8, 8)
        
        # 绘制选中状态
        if self.isChecked():
            painter.setPen(QColor(255, 255, 255))
            painter.setFont(self.font)
            painter.drawText(QRect(capsule_rect.x()+2, capsule_rect.y()+2, capsule_rect.width()-4, capsule_rect.height()-4), Qt.AlignCenter, '✓')
        
        # 绘制边框
        painter.setPen(QColor(50, 50, 50))
        painter.setBrush(Qt.NoBrush)
        painter.drawRoundedRect(border_rect, 10, 10)
        
    def sizeHint(self):
        return QSize(120, 22)
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    # 创建窗口和布局
    window = QWidget()
    window.setGeometry(100, 100, 400, 200)
    window.setWindowTitle('CapsuleRadioButton Demo')
    
    # 添加单选按钮
    radio1 = CapsuleRadioButton('Python', window)
    radio1.setGeometry(20, 20, 120, 22)
    
    radio2 = CapsuleRadioButton('Java', window)
    radio2.setGeometry(20, 50, 120, 22)
    radio2.setChecked(True)
    
    radio3 = CapsuleRadioButton('C++', window)
    radio3.setGeometry(20, 80, 120, 22)

    window.show()
    sys.exit(app.exec_())

该代码就是一个简单的演示程序,窗口中包含三个胶囊形指示器单选按钮,可以运行程序查看效果。

效果展示

效果展示

以上就是PyQt5中单选按钮的胶囊形指示器的介绍和实现过程,更多有关PyQt5的知识和实践,可以阅读PyQt5官方文档和示例程序。