我正在创建一个小型PyQt应用程序并且在MouseOver效果中陷入困境。
我有一个QMainWindow
,它有三个名为createProfileButton
,downloadPackagesButton
和installPackagesButton
的按钮。所有这些都是QPushButton
现在我创建了一个Label,当有人将鼠标悬停在这些按钮上时,它会保留文本。我检查了文档,并发现它可以使用覆盖
来处理按钮的方法。现在这意味着我必须为三个按钮中的每个按钮扩展QPushButton
,并且每个按钮都需要一个类的对象。我试图寻找当鼠标悬停或从按钮上取下时发出的信号,但是徒劳无功。我上网的所有帮助都是实现这两种方法。
Isnt是否扩展了一个类并创建了一个类似的过度杀手?不幸的是,信号很整洁,我找不到任何信号。
所以我检查了整个继承层次结构,没有发现FocusIn
和FocusOut
的信号
答案 0 :(得分:4)
如您所述,此功能不存在任何信号。你有两个基本选择。
选项1 - 子类:
class FocusEmittingButton(QPushButton):
#...
def focusInEvent(self, event):
# emit your signal
然后,您可以在客户端代码中连接到该信号。此外,如有必要,您可以使用设计师的Promote To
功能将每个按钮提升为FocusEmittingButton
类型。您只需要子类化一次,然后确保不同的按钮都是相同的类型。
选项2 - 使用QApplication.focusChanged
您还可以利用QApplication.focusChanged(oldQWidget, newQWidget)
。通过这样做,您将不需要子类化和覆盖焦点事件。相反,您连接到QApplication.focusChanged
信号,然后在处理程序中响应。
答案 1 :(得分:1)
还有另一种方法可以在父窗口小部件中接收焦点信号。您可以添加事件过滤器:
class MyParent(QWidget):
def __init__(self):
#...
self.mybutton.installEventFilter()
def eventFilter(self, obj, event):
if obj is self.mybutton and event.type() == QEvent.FocusOut:
#...
return QWidget.eventFilter(self, obj, event)