QPushButton FocusIn会生成哪个信号?

时间:2010-02-03 17:58:02

标签: python qt focus pyqt signals-slots

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

我有一个QMainWindow,它有三个名为createProfileButtondownloadPackagesButtoninstallPackagesButton的按钮。所有这些都是QPushButton

类型

现在我创建了一个Label,当有人将鼠标悬停在这些按钮上时,它会保留文本。我检查了文档,并发现它可以使用覆盖

来处理
  • focusInEvent(self,QFocusEvent)
  • focusOutEvent(self,QFocusEvent)

按钮的方法。现在这意味着我必须为三个按钮中的每个按钮扩展QPushButton,并且每个按钮都需要一个类的对象。我试图寻找当鼠标悬停或从按钮上取下时发出的信号,但是徒劳无功。我上网的所有帮助都是实现这两种方法。

Isnt是否扩展了一个类并创建了一个类似的过度杀手?不幸的是,信号很整洁,我找不到任何信号。

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

2 个答案:

答案 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)