我是 PyQt 的新手,我正在创建一些自定义 QLineEdit 小部件,并向其中添加一些 SVG 操作。我想让它们在用户将鼠标悬停在它们上方时改变颜色以表示它们是可点击的。如果可能的话,我还想包括光标更改。
这是我的一个领域的示例:
class ModernPasswordField(ModernField):
def __init__(self):
super().__init__('Password') # ModernField just adds a label and styling to the QLineEdit
self.entry_field.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
copy_icon = QtGui.QIcon('resources/test/copy.svg')
lock_icon = QtGui.QIcon('resources/test/lock.svg')
generate_icon = QtGui.QIcon('resources/test/refresh.svg')
hidden_icon = QtGui.QIcon('resources/used/invisible_eye_white.svg')
self.entry_field.addAction(lock_icon, QtWidgets.QLineEdit.LeadingPosition) # Not clickable
copy_action = self.entry_field.addAction(copy_icon, QtWidgets.QLineEdit.TrailingPosition)
hidden_action = self.entry_field.addAction(hidden_icon, QtWidgets.QLineEdit.TrailingPosition)
generate_action = self.entry_field.addAction(generate_icon, QtWidgets.QLineEdit.TrailingPosition)
我尝试查看文档,但没有看到任何用于在悬停时更改 QIcon 或颜色的样式选项。我查看了一些解决方案,其中覆盖了一些事件,但这可能有点过头了,我正在寻找是否有更好的解决方案来解决这个问题。
添加到 QLineEdit 的操作在内部作为 QToolButtons 进行管理(类似于 QToolBar)。
一种可能是在创建这些按钮后立即为其创建一个 QGraphicsOpacityEffect,并在其上安装事件过滤器以检查
Enter
和 Leave
事件。
例如:
class HoverLineEdit(QLineEdit):
def childEvent(self, event):
super().childEvent(event)
if event.type() == event.ChildPolished:
widget = event.child()
if isinstance(widget, QToolButton):
widget.installEventFilter(self)
effect = QGraphicsOpacityEffect(widget)
effect.setOpacity(.5)
widget.setGraphicsEffect(effect)
def eventFilter(self, obj, event):
if isinstance(obj, QToolButton):
if event.type() == event.Enter:
obj.graphicsEffect().setEnabled(False)
elif event.type() == event.Leave:
obj.graphicsEffect().setEnabled(True)
return super().eventFilter(obj, event)