2010-11-11 100 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)