代码之家  ›  专栏  ›  技术社区  ›  Manish Sinha

qpushbutton focusin生成哪个信号?

  •  4
  • Manish Sinha  · 技术社区  · 14 年前

    我正在创建一个小的Pyqt应用程序,并陷入了mouseover效果。

    我有一个 QMainWindow 有三个按钮 createProfileButton , downloadPackagesButton installPackagesButton . 所有这些都是类型 QPushButton

    现在我已经创建了一个标签,当有人将鼠标悬停在这些按钮上时,它将保存文本。我查了一下文件,知道可以用骑马来处理

    • FocusingEvent(自我,qFocusEvent)
    • FocusoutEvent(自我,Q焦点)

    按钮的方法。这意味着我必须延长 q按钮 对于这三个按钮中的每一个,每个按钮都必须有一个对象用于一个类。我试着寻找鼠标悬停或离开按钮时发出的信号,但没有成功。我在网上得到的所有帮助就是实现这两种方法。

    扩展类并创建每个类中的一个不是多余的吗?信号会很好,不幸的是,我找不到任何信号。

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

    2 回复  |  直到 13 年前
        1
  •  4
  •   Kaleb Pederson    14 年前

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

    选项1 -子类:

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

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

    选项2 -使用 QApplication.focusChanged

    你也可以利用 QApplication.focusChanged(oldQWidget, newQWidget) .这样做,就不需要对焦点事件进行子类化和重写。相反,您连接到 qApplication.focusChanged(应用.focusChanged) 发出信号,然后在处理程序中响应。

        2
  •  1
  •   xioxox    13 年前

    在父窗口小部件中还有另一种接收焦点信号的方法。可以添加事件筛选器:

    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)