自定义QTreeview扩展事件方法

时间:2016-11-09 14:51:14

标签: python pyside signals-slots qtreeview

当我使用定义的“扩展”方法创建自己的自定义QTreeView时,是否需要执行任何特殊操作才能发出默认信号?我已经注释掉了代表我所询问的伪代码。或者我可以安全地做我目前正在做的事情吗?

class JMTreeView(QtGui.QTreeView):

    changed = QtCore.Signal()

    def __init__(self):
        super(JMTreeView, self).__init__()
        self.expanded.connect(self.expanded_item)

    def expanded_item(self, event):
        print "expanded"
        # super(JMTreeView, self).expanded(event)

类似于当我覆盖对话框的'showEvent'时我处理的方式,我在函数的末尾调用'super'。我是否需要添加类似于“扩展”方法的内容?

def showEvent(self, event):
    geom = self.frameGeometry()
    geom.moveCenter(QtGui.QCursor.pos())
    self.setGeometry(geom)
    super(Browser, self).showEvent(event)

1 个答案:

答案 0 :(得分:1)

QTreeView类没有expanded方法。只有expanded信号。更重要的是,信号和插槽机制与事件系统完全分离,因此不会与覆盖showEvent等受保护方法并行。

大多数事件处理程序(如showEvent)与源自应用程序外部的活动相关。它们通常会实现某些默认行为,但有时根本不执行任何操作。它们几乎总是虚拟方法,这意味着您可以提供自己的Qt将调用而不是默认的实现。如果重新实现需要保持默认行为(或以某种方式修改它),它可以通过调用基类实现来实现。

相比之下,信号总是来自内部应用程序。它们没有默认处理程序 - 它们只是广播消息(如无线电信标)。完全由听众决定如何处理消息。如果从来没有任何听众,或者从未处理过这些消息,那就无所谓了。