python - 在其他 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 在悬停在按钮上时更改其颜色。
解决方案
不可能直接使用 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_())
推荐阅读
- javascript - 我可以将样式应用于文件中定义的第一个类以外的类吗?
- linux - 在 Linux 堆栈中,以太网标头在何处以及如何添加/删除?
- java - Apache Velocity 是否支持递归搜索模板?
- javascript - 如何使用简单的 JavaScript/CSS 将元素放在 DOM 中的任何给定元素之上?
- c++ - 获取键盘输入 Cpp -- 没有外部库
- python - 如何从用户输入打印函数?
- reactjs - reactJS中没有'Access-Control-Allow-Origin
- python - 根据键转换 JSON 对象或 JSON 对象数组 - Python 中的代码
- html - 如何突出显示视图包中的选项
- java - 如何确保在使用返回结果之前执行异步方法?