在使用 PyQt5 开发桌面应用程序时,常常需要使用到组合框(QComboBox)控件。有时候,我们需要在 combobox 处于关闭状态,又被用户点击后,给它添加边框效果。这时候可以通过样式表(Stylesheet)实现。
以下是 PyQT5 – 当关闭状态的组合框被按下时添加边框的完整使用攻略:
步骤1 – 导入必要模块
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox
from PyQt5.QtGui import QPainter, QColor, QBrush
from PyQt5.QtCore import Qt
我们需要用到 QApplication、QWidget、QComboBox 等 Qt 控件类,以及 QPainter 绘制控件,QColor 和 QBrush 定义颜色。
步骤2 – 创建应用程序和窗口
app = QApplication([])
window = QWidget()
创建 QApplication 和 QWidget 对象,后续所有控件都将添加到 QWidget 实例中。
步骤3 – 创建组合框和设置样式表
combobox = QComboBox(window)
combobox.setGeometry(10, 10, 120, 30)
style = """
QComboBox:!editable::down-arrow {
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
QComboBox:!editable::drop-down{
border-top-right-radius: 0px;
border-top-left-radius: 0px;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 20px;
}
"""
combobox.setStyleSheet(style)
上述代码中,我们在样式表 style 中定义了三个部分:
- QComboBox:!editable::down-arrow:针对 combobox 处于非编辑状态时,点击下箭头的样式设置,设置下箭头的边框。
- QComboBox:!editable::drop-down:针对 combobox 处于非编辑状态时,该控件的下拉箭头部分的样式设置,设置下箭头的边框。
- QComboBox::drop-down:针对 combobox 的下拉箭头部分进行样式设置,设置箭头在 padding 区域内左对齐并与右侧对齐。width 属性设置箭头的宽度为 20px。
步骤4 – 绘制边框
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QColor('#299AF7'))
painter.setBrush(QColor('#299AF7'))
painter.drawRect(0, 0, self.width() - 1, self.height() - 1)
combobox.paintEvent = paintEvent
我们定义了 paintEvent 方法,使用 QPainter 绘制一个颜色为 #299AF7 的矩形框作为 combobox 的边框。最后将自定义的 paintEvent 方法赋值给 combobox 的 paintEvent 方法。
步骤5 – 设置窗口大小和显示窗口
window.resize(200, 200)
window.show()
app.exec_()
最后设置窗口大小和显示,执行应用程序。
示例
以下是两个示例。第一个示例演示 combobox 按钮被点击后的边框效果:
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox
from PyQt5.QtGui import QPainter, QColor, QBrush
from PyQt5.QtCore import Qt
app = QApplication([])
window = QWidget()
combobox = QComboBox(window)
combobox.setGeometry(10, 10, 120, 30)
style = """
QComboBox:!editable::down-arrow {
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
QComboBox:!editable::drop-down{
border-top-right-radius: 0px;
border-top-left-radius: 0px;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 20px;
}
"""
combobox.setStyleSheet(style)
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QColor('#299AF7'))
painter.setBrush(QColor('#299AF7'))
painter.drawRect(0, 0, self.width() - 1, self.height() - 1)
combobox.paintEvent = paintEvent
window.resize(200, 200)
window.show()
app.exec_()
第二个示例演示 combobox 带有 text,但没有选择任何一项时,边框效果:
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox
from PyQt5.QtGui import QPainter, QColor, QBrush
from PyQt5.QtCore import Qt
app = QApplication([])
window = QWidget()
combobox = QComboBox(window)
combobox.setGeometry(10, 10, 120, 30)
combobox.addItem("please select")
combobox.addItem("item1")
combobox.addItem("item2")
style = """
QComboBox:!editable::down-arrow {
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
QComboBox:!editable::drop-down{
border-top-right-radius: 0px;
border-top-left-radius: 0px;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 20px;
}
"""
combobox.setStyleSheet(style)
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QColor('#299AF7'))
painter.setBrush(QColor('#299AF7'))
painter.drawRect(0, 0, self.width() - 1, self.height() - 1)
combobox.paintEvent = paintEvent
window.resize(200, 200)
window.show()
app.exec_()
以上就是 PyQT5 – 当关闭状态的组合框被按下时添加边框的完整使用攻略,通过样式表和paintEvent方法实现。