📜  PyQt5 - 制作圆形组合框(1)

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

PyQt5 - 制作圆形组合框

简介

组合框(QComboBox)是PyQt5中常用的控件之一,可以让用户从预定义的列表中选择一个选项。本文将介绍如何制作一个圆形的组合框。

实现步骤
  1. 创建一个QComboBox对象;
  2. 设置其样式表(StyleSheet);
  3. 通过paintEvent事件绘制一个圆形;
  4. 将圆形区域设为组合框的点击区域(响应用户点击事件);
  5. 将组合框的下拉框向下平移,使其不影响圆形的显示。
代码实现
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class RoundComboBox(QComboBox):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet("""
            QComboBox {{
                border: 1px solid gray; 
                border-radius: 30px;
                color: black;
                padding: 3px 18px 3px 3px;
                background: white;
                font-size: 14px;
                selection-background-color: #F5A9A9;
                height: 32px;
            }}

            QComboBox QAbstractItemView {{
                border: 1px solid gray; 
                selection-background-color: #E6E6E6;
                background: white;
            }}
        """)  # 设置样式表

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)  # 抗锯齿
        painter.setPen(Qt.NoPen)
        painter.setBrush(QBrush(QColor("#E6E6E6")))  # 填充颜色
        painter.drawEllipse(self.rect())
        super().paintEvent(event)

    def showPopup(self):
        super().showPopup()
        self.view().move(self.view().pos().x(), self.view().pos().y() + 32)  # 下拉框向下平移

    def mousePressEvent(self, event):
        if event.pos().x() > self.width() - 35:  # 判断是否点击到圆形区域
            super().mousePressEvent(event)


if __name__ == '__main__':
    app = QApplication([])
    combo_box = RoundComboBox()
    combo_box.addItems(["Item 1", "Item 2", "Item 3"])
    combo_box.show()
    app.exec()
解释说明
  1. 在构造函数中设置组合框的样式表,通过border-radius属性将其设置为圆形;
  2. 在paintEvent事件中绘制圆形,通过drawEllipse()函数绘制;并在最后调用父类的paintEvent()方法,绘制组合框的内容和边框;
  3. 在showPopup()函数中,调用父类的showPopup()方法,使得下拉框出现在默认位置(下方),然后通过移动下拉框的位置,使其不遮挡圆形;
  4. 重载mousePressEvent()函数,判断用户点击时是否在圆形范围内,以此响应组合框的操作。

通过以上实现,我们就可以得到一个圆形的组合框。

RoundComboBox