【Python_PySide6学习笔记(三十八)】基于QPushButton实现自定义的圆形按键指示灯类tQCircularButton

基于QPushButton实现自定义的圆形按键指示灯类tQCircularButton

基于QPushButton实现自定义的圆形按键指示灯类tQCircularButton

前言

在 GUI 界面开发中,我们经常会用到圆形按键指示灯来做提示,在 PyQt 中没有这样的类可以直接使用,所以本文介绍一种方法,基于 QPushButton 实现自定义的圆形按键指示灯类,最终实现如下图所示:

正文

1、Qt样式表

1.1 Qt样式表

PySide 中的 Qt 样式表(Qt Style Sheets,简称 QSS)是一种强大的机制,允许开发者自定义 Qt 应用程序中窗口小部件(widgets)的外观。QSS 的概念和语法在很大程度上受到 HTML 级联样式表(CSS)的启发,但专为 Qt 应用程序中的小部件设计。

1.2 样式属性

QSS 支持多种样式属性,以下是一些常用的属性:

  • 背景background-colorbackground-imagebackground-repeat 等,用于设置小部件的背景;
  • 边框borderborder-styleborder-widthborder-color 等,用于设置小部件的边框样式;
  • 字体font-familyfont-sizecolor 等,用于设置小部件中文本的字体和颜色;
  • 边距与填充marginpadding 等,用于设置小部件内容与其边框之间的空间。

2、设置Qt样式表

那想要实现圆形按键,就需要通过 Qt 样式表来对 QPushButton 对象进行设置,重点是 border-radius,这个关键属性,它决定了边框的圆角程度。

python 复制代码
        # 设置形状为圆形 初始样式表,使用f-string来插入直径的一半作为border-radius
        self.setStyleSheet(f"""
            QPushButton {{
                border-radius: {self.diameter // 2}px;
                padding: 0;
            }}
        """)

3、tQCircularButton类

那基于以上介绍,就可以得到自定义的圆形按键指示灯

python 复制代码
from tModels.tResource import *
import qdarkstyle
from qdarkstyle.dark.palette import DarkPalette  # noqa: E402
from qdarkstyle.light.palette import LightPalette  # noqa: E402


# 自定义圆形按钮指示灯,可以设置颜色;
class ctQCircularButton(QPushButton):
    # 构造函数
    def __init__(self, diameter=50, background_color="#8191B6", parent=None):
        super().__init__(parent)
        self.diameter = diameter
        self.background_color = background_color
        # 设置按钮的固定大小
        self.setFixedSize(self.diameter, self.diameter)
        # 设置按钮样式为圆形和深色模式
        self.f_recoverFunc()

    # 指示按键设置颜色函数
    def f_setColorFunc(self, is_active):
        """
        function:  指示按键设置颜色函数
              in:  is_active: 布尔值,True为绿色,False为红色
             out:  None
          return:  None
          others:  CircularButton Set Color Func
        """
        color = "#00FF7F" if is_active else 'red'
        # 更新样式表,使用f-string来插入新的颜色
        self.setStyleSheet(f"""  
            QPushButton {{  
                border: 2px solid {color};  
                border-radius: {self.diameter // 2}px;  
                color: black;  
                background-color: {color};  
                padding: 0;  
            }}  
        """)

    # 设置按钮样式为圆形和深色模式
    def f_recoverFunc(self):
        """
        function:  设置按钮样式为圆形和深色模式
              in:  None
             out:  None
          return:  None
          others:  Set Button Style Func
        """
        # 指示按键设置深色主题
        self.setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyside6', palette=DarkPalette))
        # 设置形状为圆形 初始样式表,使用f-string来插入直径的一半作为border-radius
        self.setStyleSheet(f"""
            QPushButton {{
                border-radius: {self.diameter // 2}px;
                padding: 0;
            }}
        """)

在以上代码中,引入了 qdarkstyle 的深色主题。

4、使用示例

python 复制代码
from PySide6.QtWidgets import QPushButton, QApplication, QWidget, QVBoxLayout
import qdarkstyle
from qdarkstyle.dark.palette import DarkPalette  # noqa: E402
from qdarkstyle.light.palette import LightPalette  # noqa: E402


class ctQCircularButton(QPushButton):
    # 构造函数
    def __init__(self, diameter=50, background_color="#8191B6", parent=None):
        super().__init__(parent)
        self.diameter = diameter
        self.background_color = background_color
        # 设置按钮的固定大小
        self.setFixedSize(self.diameter, self.diameter)
        # 设置按钮样式为圆形和深色模式
        self.f_recoverFunc()

    # 指示按键设置颜色函数
    def f_setColorFunc(self, is_active):
        """
        function:  指示按键设置颜色函数
              in:  is_active: 布尔值,True为绿色,False为红色
             out:  None
          return:  None
          others:  CircularButton Set Color Func
        """
        color = "#00FF7F" if is_active else 'red'
        # 更新样式表,使用f-string来插入新的颜色
        self.setStyleSheet(f"""  
            QPushButton {{  
                border: 2px solid {color};  
                border-radius: {self.diameter // 2}px;  
                color: black;  
                background-color: {color};  
                padding: 0;  
            }}  
        """)

    # 设置按钮样式为圆形和深色模式
    def f_recoverFunc(self):
        """
        function:  设置按钮样式为圆形和深色模式
              in:  None
             out:  None
          return:  None
          others:  Set Button Style Func
        """
        # 指示按键设置深色主题
        self.setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyside6', palette=DarkPalette))
        # 设置形状为圆形 初始样式表,使用f-string来插入直径的一半作为border-radius
        self.setStyleSheet(f"""
            QPushButton {{
                border-radius: {self.diameter // 2}px;
                padding: 0;
            }}
        """)


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet(qdarkstyle.load_stylesheet(qt_api='pyside6', palette=DarkPalette))
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()

        # 创建圆形按钮
        btn = ctQCircularButton(50)
        layout.addWidget(btn)

        # 示例:改变颜色
        btn.f_setColorFunc(True)  # 变为绿色
        # btn.f_setColorFunc(False)  # 变为红色,取消上面这行的注释来查看效果

        self.setLayout(layout)
        self.setWindowTitle('圆形按钮示例')
        self.setGeometry(100, 100, 200, 150)


if __name__ == '__main__':
    app = QApplication([])
    ex = MainWindow()
    ex.show()
    app.exec()
    

也可以根据自己的需要进行其他设置,如边框的颜色、边框的粗细等。

相关推荐
THMAIL3 小时前
机器学习从入门到精通 - 机器学习调参终极手册:网格搜索、贝叶斯优化实战
人工智能·python·算法·机器学习·支持向量机·数据挖掘·逻辑回归
ERP老兵-冷溪虎山3 小时前
Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
java·javascript·python·golang·中医编程·四语言同步学习·职场生存指南
科技树支点3 小时前
无GC的Java创新设计思路:作用域引用式自动内存管理
java·python·go·web·编程语言·编译器
THMAIL4 小时前
机器学习从入门到精通 - 集成学习核武器:随机森林与XGBoost工业级应用
人工智能·python·算法·随机森林·机器学习·集成学习·sklearn
程序员miki5 小时前
Pytorch的CUDA版本安装使用教程
人工智能·pytorch·python
小冷coding5 小时前
随时随地写代码:Jupyter Notebook+cpolar让远程开发像在本地一样流畅
ide·python·jupyter
偷心伊普西隆6 小时前
Pandas DataFrame 指南
python·数据分析·pandas
Yokon_D6 小时前
Pycharm终端pip install的包都在C:\Users\\AppData\Roaming\Python\解决办法
python·pycharm·pip
爱补鱼的猫猫6 小时前
pytorch可视化工具(训练评估:Tensorboard、swanlab)
人工智能·pytorch·python
川石课堂软件测试7 小时前
Oracle 数据库使用事务确保数据的安全
数据库·python·功能测试·docker·oracle·单元测试·prometheus