PyQt5 – 当鼠标悬停在组合框上时为其添加边框

  • Post category:Python

使用PyQt5库实现为组合框添加边框的步骤及示例说明如下:

步骤1 – 安装PyQt5

首先需要安装PyQt5库,可以使用 pip 工具进行安装,命令如下:

pip install PyQt5

如果你在使用anaconda环境,可以执行以下命令进行安装:

conda install pyqt

步骤2 – 创建GUI应用程序

在这一步中,我们将要创建一个PyQt5 GUI应用程序,并添加一个组合框(QComboBox)到窗口上。建议将程序分为两个文件,一个是创建窗口(main.py),另一个是实现具体功能(combobox.py)。

首先在 main.py 文件中编写代码,具体步骤如下:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout
from combobox import Combo

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 - ComboBox Border Example")
        self.setFixedSize(400, 300)

        # 创建 widget 容器,并将它设置为 QWidget
        widget = QWidget(self)
        self.setCentralWidget(widget)

        # 创建 QVBoxLayout 将 widget 包装在其中
        layout = QVBoxLayout(widget)

        # 创建 Combo 实例,并添加到 layout 中
        combo = Combo(self)
        layout.addWidget(combo)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

main.py 中,我们创建了一个 MainWindow 类,并继承了 QMainWindow。在 __init__ 构造函数中,设置窗口标题和尺寸,然后创建 QWidget 实例并将其设置为中心小部件,将 QVBoxLayout 添加到此 widget 中,并添加 Combo 实例作为子部件。

接着在 combobox.py 文件中实现实现具体功能,具体步骤如下:

from PyQt5.QtWidgets import QComboBox, QStyle

class Combo(QComboBox):
    def __init__(self, parent=None):
        super(Combo, self).__init__(parent)
        self.setStyleSheet('QComboBox{padding: 3px;}')

    def enterEvent(self, event):
        self.setStyleSheet('QComboBox{padding: 3px; border: 1px solid gray ;}')
        super(Combo, self).enterEvent(event)

    def leaveEvent(self, event):
        self.setStyleSheet('QComboBox{padding: 3px;}')
        super(Combo, self).leaveEvent(event)

combobox.py 中,我们创建了一个名为 Combo 的类,并继承 QComboBox 类。在此类的构造函数中,设置了一个 padding 样式,以更好地展示组合框的样式。

然后,我们重载 enterEventleaveEvent 方法,在鼠标进入此组合框时,在基础样式上添加了边框,鼠标 离开此组合框时我们移除了边框。

示例说明1:为单个组合框控件添加边框

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QComboBox
from PyQt5.QtGui import QIntValidator

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 - ComboBox Border Example")
        self.setFixedSize(400, 300)

        # 创建 widget 容器,并将它设置为 QWidget
        widget = QWidget(self)
        self.setCentralWidget(widget)

        # 创建 QVBoxLayout 将 widget 包装在其中
        layout = QVBoxLayout(widget)

        # 创建 QComboBox 实例,并添加到 layout 中
        combo = QComboBox(self)
        combo.addItems(['Apple', 'Banana', 'Cherry', 'Durian'])
        layout.addWidget(combo)

        # 为 QComboBox 实例添加边框
        combo.setStyleSheet('QComboBox{padding: 3px; border: 1px solid gray ;}')        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

在此示例中,我们直接在组合框实例对象的样式表中添加了一个 border:边框样式。无需通过重载鼠标事件来改变样式。

示例说明2:通过继承QComboBox来添加组合框的边框

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout
from combobox import Combo

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 - ComboBox Border Example")
        self.setFixedSize(400, 300)

        # 创建 widget 容器,并将它设置为 QWidget
        widget = QWidget(self)
        self.setCentralWidget(widget)

        # 创建 QVBoxLayout 将 widget 包装在其中
        layout = QVBoxLayout(widget)

        # 创建 Combo 实例,并添加到 layout 中
        combo = Combo(self)
        combo.addItems(['Apple', 'Banana', 'Cherry', 'Durian'])
        layout.addWidget(combo)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

在此示例中,我们使用了上面提到的自定义 Combo 继承自 QComboBox 的类,通过设置自定义边框样式的方式来达到我们的效果。编写方式可以参照 combobox.py 文件内的代码。