2010-11-11 104 views
5

我想用PyQt连接到QTreeView的selectionChanged信号。我过去做过这个(对于QTableView)并且成功了。但是现在我无法得到类似的代码来工作。PyQt QTreeView:试图连接到selectionChanged信号

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

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" 

回答

13

好的,计算出来(主要是意外)。

因为我在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" 
3

如果您使用的声明,你可以这样做:

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