2010-11-11 16 views
5

Próbuję połączyć się z sygnałem selectionChanged z QTreeView za pomocą PyQt. Zrobiłem to w przeszłości (dla QTableView) i odniosłem sukces. Ale teraz nie mogę uzyskać podobnego kodu do działania.PyQt QTreeView: Próbuję połączyć się z sygnałem selectionChanged

W poniższym przykładzie kodu pomyślnie łączę się z sygnałami rozwiniętymi i zwiniętymi, ale nie z sygnałami wyboruChanged lub enabled. Czy ktoś może mi powiedzieć, co robię źle? Dzięki.

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" 

Odpowiedz

13

OK, wymyśliłem to (głównie przez przypadek).

Od czasu utworzenia połączeń w init, ale tylko ustawienie modelu dla tego QTreeView później, nie było prawidłowego SelectionModel w miejscu.

Aby pracować musiałem dokonać dwóch zmian:

1) Przedmiotem emitujące musiały zostać zmienione, aby być selectionModel w QTreeView użytkownika. Nie wiem dlaczego, ale niektórzy (rzadkie) przykłady w sieci zasugerował, że może to być przypadek

i

2) musiałem zastąpić metodę setModel z następujących QTreeView taki sposób, że wywołuje superklasę "Metoda setModel, a następnie wykonuje połączenia później.

Tak więc nowy kod wygląda następująco:

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

Jeśli używasz deklaratywnej można zrobić coś takiego:

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