📌  相关文章
📜  PyQt5 ComboBox - 不可编辑和鼠标悬停时不同的边框大小(1)

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

PyQt5 ComboBox - 不可编辑和鼠标悬停时不同的边框大小

在 PyQt5 中,ComboBox 是一个常用的控件,它允许用户从下拉列表中选择一个选项。默认情况下,ComboBox 可以被编辑,当用户点击下拉箭头时,它会弹出一个下拉列表,用户可以输入自定义的文本或者选择一个列表中的选项。

有时候,我们希望 ComboBox 不可编辑,并且在鼠标悬停时显示不同的边框大小。本文将介绍如何实现这一效果。

不可编辑的 ComboBox

要使 ComboBox 不可编辑,在 PyQt5 中可以使用 setEditable(bool) 方法。当参数为 False 时,ComboBox 就不能被编辑了。

combo_box = QComboBox()
combo_box.setEditable(False)
鼠标悬停时不同的边框大小

要实现鼠标悬停时不同的边框大小,我们可以继承 QComboBox 并重写其 paintEvent 方法。在 paintEvent 中,我们可以获取鼠标是否在 ComboBox 区域内,如果是,则设置边框宽度为 2,否则为 1。

class HoverComboBox(QComboBox):
    def __init__(self, parent=None):
        super(HoverComboBox, self).__init__(parent)

    def paintEvent(self, event):
        painter = QPainter(self)
        option = QStyleOptionComboBox()
        self.initStyleOption(option)
        if self.underMouse():
            option.frame = True
            option.lineWidth = 2
        else:
            option.frame = False
            option.lineWidth = 1
        self.style().drawComplexControl(QStyle.CC_ComboBox, option, painter)
        self.style().drawControl(QStyle.CE_ComboBoxLabel, option, painter)

在使用时,我们可以这样:

combo_box = HoverComboBox()
combo_box.addItems(["Item 1", "Item 2", "Item 3"])
完整代码
from PyQt5.QtWidgets import QApplication, QComboBox, QStyleOptionComboBox
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
from PyQt5.QtStyle import QStyle


class HoverComboBox(QComboBox):
    def __init__(self, parent=None):
        super(HoverComboBox, self).__init__(parent)

    def paintEvent(self, event):
        painter = QPainter(self)
        option = QStyleOptionComboBox()
        self.initStyleOption(option)
        if self.underMouse():
            option.frame = True
            option.lineWidth = 2
        else:
            option.frame = False
            option.lineWidth = 1
        self.style().drawComplexControl(QStyle.CC_ComboBox, option, painter)
        self.style().drawControl(QStyle.CE_ComboBoxLabel, option, painter)


if __name__ == "__main__":
    app = QApplication([])
    combo_box = HoverComboBox()
    combo_box.addItems(["Item 1", "Item 2", "Item 3"])
    combo_box.show()
    app.exec_()

以上就是如何实现 PyQt5 ComboBox 不可编辑和鼠标悬停时不同的边框大小的介绍。