PyQt QTreeView:尝试连接到selectionChanged信号

6

我正在尝试使用PyQt连接到QTreeView的selectionChanged信号。 我以前曾经这样做过(对于QTableView),并且取得了成功。 但是现在我无法使类似的代码工作。

在以下代码示例中,我成功地连接到了展开和折叠信号,但无法连接到selectionChanged或activated信号。 有人能告诉我我做错了什么吗? 谢谢。

from PyQt4 import QtGui
from PyQt4 import QtCore

################################################################################
class ShaderDefTreeView(QtGui.QTreeView):
    """
    Overrides the QTreeView to handle keypress events.
    """

    #---------------------------------------------------------------------------
    def __init__(self, parent=None):
        """
        Constructor for the ShaderDefTreeView class.
        """
        super(ShaderDefTreeView, self).__init__(parent)

        #listen to the selectionChanged signal
        print "Connecting"

        #whenever the selection changes, let the data model know
        self.connect(self, 
                     QtCore.SIGNAL("selectionChanged(QItemSelection&, QItemSelection&)"),
                     self.store_current_selection)
        self.connect(self, QtCore.SIGNAL("activated(const QModelIndex &)"),
                     self.activated)
        self.connect(self, QtCore.SIGNAL("collapsed(const QModelIndex &)"),
                     self.collapsed)
        self.connect(self, QtCore.SIGNAL("expanded(const QModelIndex &)"),
                     self.expanded)


    #---------------------------------------------------------------------------
    def store_current_selection(self, newSelection, oldSelection):
        print "changed"
        #self.model().selection_changed(newSelection)


    #---------------------------------------------------------------------------
    def expanded(self, newSelection):
        print "expanded"


    #---------------------------------------------------------------------------
    def collapsed(self, newSelection):
        print "collapsed"


    #---------------------------------------------------------------------------
    def activated(self, newSelection):
        print "activated"
2个回答

14

好的,我解决了(大部分是偶然发现的)。

因为我在 init 中建立了连接,但是只有在稍后设置这个 QTreeView 的模型时,才有有效的 selectionModel。

为了让它工作,我必须做两个更改:

1)发出信号的对象必须更改为 QTreeView 的 selectionModel。我不知道为什么,但一些(罕见的)网络示例表明可能是这种情况。

2)我必须重写 QTreeView 的 setModel 方法,使其调用超类的 setModel 方法,然后在之后建立连接。

所以新代码看起来像这样:

class ShaderDefTreeView(QtGui.QTreeView):
    """
    Overrides the QTreeView to handle keypress events.
    """

    #---------------------------------------------------------------------------
    def __init__(self, parent=None):
        """
        Constructor for the ShaderDefTreeView class.
        """
        super(ShaderDefTreeView, self).__init__(parent)


    #---------------------------------------------------------------------------
    def setModel(self, model):
        super(ShaderDefTreeView, self).setModel(model)
        self.connect(self.selectionModel(),  
                     QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),  
                     self.store_current_selection) 


    #---------------------------------------------------------------------------
    def store_current_selection(self, newSelection, oldSelection):
        print "changed"

7
如果您正在使用声明式编程,可以这样做:

如果您正在使用声明式编程,可以这样做:

self.ui = uic.loadUi(main_path, self)
self.ui.tree.selectionModel().selectionChanged.connect(self.item_selection_changed_slot)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接