4

我正在创建一个小型 PyQt 应用程序并陷入 MouseOver 效果。

我有一个名为,和的QMainWindow三个按钮。所有这些都是类型createProfileButtondownloadPackagesButtoninstallPackagesButtonQPushButton

现在我创建了一个标签,当有人将鼠标悬停在任何这些按钮上时,它将保存文本。我检查了文档并知道可以使用覆盖来处理它

  • focusInEvent(self, QFocusEvent)
  • focusOutEvent(自我,QFocusEvent)

按钮的方法。现在这意味着我必须为QPushButton三个按钮中的每一个进行扩展,并且它们中的每一个都必须为一个类的对象。我尝试寻找鼠标悬停或离开按钮时发出的信号,但徒劳无功。我在网上获得的所有帮助都是实现这两种方法。

扩展一个类并创建一个类不是矫枉过正吗?信号会很整洁,不幸的是,我找不到任何信号。

所以我检查了整个继承层次结构,没有发现FocusInand的信号FocusOut

4

2 回答 2

4

正如您所说,此功能不存在任何信号。你有两个基本的选择。

选项 1 - 子类:

class FocusEmittingButton(QPushButton):
    #...
    def focusInEvent(self, event):
        # emit your signal

然后,您可以在客户端代码中连接到该信号。此外,如有必要,您可以使用设计器的Promote To功能将每个按钮提升为FocusEmittingButton类型。您只需要子类化一次,然后确保不同的按钮都是相同的类型。

选项 2 - 使用QApplication.focusChanged

您还可以利用QApplication.focusChanged(oldQWidget, newQWidget). 通过这样做,您不需要继承和覆盖焦点事件。相反,您连接到QApplication.focusChanged信号,然后在处理程序中响应。

于 2010-02-03T18:42:28.747 回答
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)
于 2010-07-17T22:25:29.093 回答