2010-11-11 17 views
5

Sto provando a connettermi al segnale SelectChanged di un QTreeView usando PyQt. Ho fatto questo in passato (per un QTableView) e ho avuto successo. Ma ora non riesco a ottenere codice simile per funzionare.PyQt QTreeView: tentare di connettersi al segnale selectionChanged

Nell'esempio di codice seguente, mi collego correttamente ai segnali espansi e compressi, ma non ai segnali selezionati o attivati. Qualcuno potrebbe dirmi cosa sto facendo di sbagliato? Grazie.

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" 

risposta

13

Ok, l'ho capito (principalmente per caso).

Poiché stavo eseguendo i collegamenti nell'iniziale , ma solo dopo aver impostato il modello per questo QTreeView in seguito, non era presente un dispositivo di selezione valido.

Al fine di farlo funzionare ho dovuto fare due cambi:

1) L'oggetto che emette doveva essere cambiato per essere SelectionModel del QTreeView. Non so perché, ma alcuni (rari) esempi sul web suggerito che questo potrebbe essere il caso

e

2) ho dovuto sovrascrivere il metodo setModel del QTreeView tale che chiama la superclasse 'metodo setModel e quindi effettua le connessioni in seguito.

Così il nuovo codice simile a questo:

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

Se si utilizza dichiarativa si può fare qualcosa di simile:

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