我想自定义QComboBox列表背景。当我悬停时,我需要一个圆角框。我已附上当前图片和我需要的内容。
这是我的样式表代码
QComboBox {
border: 1px solid black;
background-color: white;
font-size: 15pt;
padding: 1px 18px 1px 3px;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 18px;
border-left-width: 1px;
border-left-color: black;
border-left-style: solid;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
background-color: white;
}
QComboBox::down-arrow {
image: url(:/Black/icons/feather/Black/chevron-down.svg);
width: 15px;
height: 10px;
}
QComboBox:focus {
border: 2px solid blue;
}
为了实现 QComboBox 下拉列表悬停时的圆角框效果,你需要使用 QProxyStyle 来自定义样式。
以下是实现步骤以及代码示例:
1. 创建自定义样式类
创建一个继承自 QProxyStyle 的新类,并重写
drawPrimitive()
方法。在这个方法中,我们将处理
PE_PanelItemViewItem
元素,该元素代表下拉列表中的每一项。
from PyQt5.QtCore import QRect, QStyleOptionViewItem
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtWidgets import QStyle, QProxyStyle
class CustomComboBoxStyle(QProxyStyle):
def drawPrimitive(self, element, option, painter, widget=None):
if element == QStyle.PE_PanelItemViewItem:
# 获取选项的矩形区域
rect = option.rect
# 如果选项处于悬停状态
if option.state & QStyle.State_Selected:
# 设置圆角矩形的半径
radius = 5
# 设置背景颜色
painter.setBrush(QColor(200, 200, 255))
# 创建圆角矩形路径
path = QPainterPath()
path.addRoundedRect(rect, radius, radius)
# 绘制圆角矩形
painter.setPen(QPen(Qt.NoPen))
painter.drawPath(path)
else:
# 使用默认样式绘制其他状态
super().drawPrimitive(element, option, painter, widget)
else:
# 使用默认样式绘制其他元素
super().drawPrimitive(element, option, painter, widget)
2. 将自定义样式应用于 QComboBox
创建 QComboBox 对象后,将自定义样式应用于它。
from PyQt5.QtWidgets import QApplication, QComboBox, QVBoxLayout, QWidget
# ... (创建 CustomComboBoxStyle 类)
app = QApplication([])
# 创建 QComboBox 并添加选项
combo_box = QComboBox()
combo_box.addItems(["选项 1", "选项 2", "选项 3"])
# 创建自定义样式对象
style = CustomComboBoxStyle()
# 将自定义样式应用于 QComboBox
combo_box.setStyle(style)
# ... (将 QComboBox 添加到布局中)
app.exec_()
完整代码示例:
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QPainter, QColor, QPen, QPainterPath
from PyQt5.QtWidgets import QApplication, QComboBox, QVBoxLayout, QWidget, QStyle, QProxyStyle
class CustomComboBoxStyle(QProxyStyle):
def drawPrimitive(self, element, option, painter, widget=None):
if element == QStyle.PE_PanelItemViewItem:
rect = option.rect
if option.state & QStyle.State_Selected:
radius = 5
painter.setBrush(QColor(200, 200, 255))
path = QPainterPath()
path.addRoundedRect(rect, radius, radius)
painter.setPen(QPen(Qt.NoPen))
painter.drawPath(path)
else:
super().drawPrimitive(element, option, painter, widget)
else:
super().drawPrimitive(element, option, painter, widget)
app = QApplication([])
combo_box = QComboBox()
combo_box.addItems(["选项 1", "选项 2", "选项 3"])
style = CustomComboBoxStyle()
combo_box.setStyle(style)
layout = QVBoxLayout()
layout.addWidget(combo_box)
window = QWidget()
window.setLayout(layout)
window.show()
app.exec_()
这段代码创建了一个带有圆角框的 QComboBox 下拉列表,当鼠标悬停在选项上时,会显示蓝色背景。你可以根据需要修改颜色、圆角半径和其他样式属性。
标签:python,list,qcombobox From: 78800521