📌  相关文章
📜  PyQt5 – 鼠标悬停时为不可编辑组合框的 lineedit 部分添加边框(1)

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

PyQt5 – 鼠标悬停时为不可编辑组合框的 lineedit 部分添加边框

在 PyQt5 中,我们可以通过鼠标悬停事件为不可编辑组合框的 lineedit 部分添加边框。这种效果可以提高用户交互体验,并使应用程序更加独特。

以下是示例代码:

from PyQt5.QtWidgets import QApplication, QComboBox, QLineEdit, QVBoxLayout, QWidget
from PyQt5.QtGui import QCursor

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

        # 添加不可编辑的 lineedit 部分
        self.setEditable(True)
        self.lineEdit().setReadOnly(True)
        
        # 将 lineedit 部分的焦点策略设置为 NoFocus
        self.lineEdit().setFocusPolicy(QtCore.Qt.NoFocus)
        
        # 为鼠标悬停事件添加事件处理器
        self.enterEvent = lambda event: self.show_box_shadow()
        self.leaveEvent = lambda event: self.hide_box_shadow()

    def show_box_shadow(self):
        # 鼠标悬停时为 lineedit 部分添加边框
        cursor = QCursor.pos()
        x, y = self.mapFromGlobal(cursor).x(), self.mapFromGlobal(cursor).y()
        if self.lineEdit().geometry().contains(x, y):
            self.lineEdit().setStyleSheet("border: 1px solid grey; border-radius: 5px;")

    def hide_box_shadow(self):
        # 鼠标离开时隐藏边框
        self.lineEdit().setStyleSheet("border: none;")

class App(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        # 创建布局
        layout = QVBoxLayout()

        # 创建组合框
        combo_box = ComboBox()
        
        # 添加选项
        combo_box.addItem("item 1")
        combo_box.addItem("item 2")
        combo_box.addItem("item 3")

        # 将组合框添加到布局中
        layout.addWidget(combo_box)

        # 设置布局
        self.setLayout(layout)

        # 设置窗口属性
        self.setWindowTitle("PyQt5 – 鼠标悬停时为不可编辑组合框的 lineedit 部分添加边框")
        self.setGeometry(300, 300, 300, 200)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

这段代码创建了一个自定义的组合框控件 ComboBox,它继承自原生的 QComboBox。其中,ComboBox 类中处理了鼠标悬停事件,当鼠标位于 lineedit 区域时,会在 lineedit 周围绘制一个灰色边框。

在主函数 App 中,我们将自定义的 ComboBox 添加到布局中,并设置窗口属性。运行程序后,您将看到一个带有三个选项的组合框。当您将鼠标悬停在 lineedit 区域时,会出现一个灰色边框。这种效果可以帮助用户更清晰地了解哪个部分是可选择的。

以上介绍的就是如何在 PyQt5 中为不可编辑组合框的 lineedit 部分添加边框。通过该示例,您可以学习如何自定义组合框,并处理鼠标悬停事件。