首页 > 解决方案 > 在其他 QtObjects 上应用 Qt 伪状态

问题描述

我有以下测试脚本。

from PyQt5.QtWidgets import *
import sys


class MW(QMainWindow):
    def __init__(self):
        super(MW, self).__init__()
        widget = QWidget()
        widget.setStyleSheet('QWidget {background-color:#000000; color:#FFFFFF}'
                             "QPushButton:hover {background-color:#202020}")

        self.setCentralWidget(widget)
        box = QVBoxLayout(widget)
        but1_box = QHBoxLayout()
        but1 = QPushButton("Button 1")

        lab1 = QLabel("Label 1")

        but1_box.addWidget(but1)
        but1_box.addWidget(lab1)
        box.addLayout(but1_box)

        but2_box = QHBoxLayout()
        but2 = QPushButton("Button 2")

        lab2 = QLabel("Label 2")

        but2_box.addWidget(but2)
        but2_box.addWidget(lab2)
        box.addLayout(but2_box)
        self.show()


app = QApplication(sys.argv)
mw = MW()
sys.exit(app.exec_())

如果我将鼠标悬停在 PushButton 上,它会将其颜色更改为灰色,并且我希望关联的 Label 在悬停在按钮上时更改其颜色。

标签: pythonpyqtpyqt5qtstylesheets

解决方案


不可能直接使用 Qt 样式表的伪状态来实现,但您必须使用 eventFilter 来检测悬停(进入和离开)的变化并修改其他元素的样式表

from PyQt5.QtCore import pyqtSignal, QEvent, QObject
from PyQt5.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QMainWindow,
    QPushButton,
    QVBoxLayout,
    QWidget,
)
import sys


class HoverListener(QObject):
    entered = pyqtSignal()
    leaved = pyqtSignal()

    def __init__(self, widget):
        super(HoverListener, self).__init__(widget)
        self._widget = widget
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, obj, event):
        if obj == self.widget:
            if event.type() == QEvent.Enter:
                self.entered.emit()
            elif event.type() == QEvent.Leave:
                self.leaved.emit()
        return super(HoverListener, self).eventFilter(obj, event)


class MW(QMainWindow):
    def __init__(self):
        super(MW, self).__init__()
        widget = QWidget()
        widget.setStyleSheet(
            "QWidget {background-color:#000000; color:#FFFFFF}"
            "QPushButton:hover {background-color:#202020}"
        )

        self.setCentralWidget(widget)

        but1 = QPushButton("Button 1")
        lab1 = QLabel("Label 1")

        hover_listener1 = HoverListener(but1)
        hover_listener1.entered.connect(
            lambda label=lab1: label.setStyleSheet("background-color:#202020")
        )
        hover_listener1.leaved.connect(lambda label=lab1: label.setStyleSheet(""))

        but2 = QPushButton("Button 2")
        lab2 = QLabel("Label 2")

        hover_listener2 = HoverListener(but2)
        hover_listener2.entered.connect(
            lambda label=lab2: label.setStyleSheet("background-color:#202020")
        )
        hover_listener2.leaved.connect(lambda label=lab2: label.setStyleSheet(""))

        box = QVBoxLayout(widget)
        but1_box = QHBoxLayout()
        but1_box.addWidget(but1)
        but1_box.addWidget(lab1)
        box.addLayout(but1_box)
        but2_box = QHBoxLayout()
        but2_box.addWidget(but2)
        but2_box.addWidget(lab2)
        box.addLayout(but2_box)
        self.show()


app = QApplication(sys.argv)
mw = MW()
sys.exit(app.exec_())

推荐阅读