2010-11-11 23 views
5

Ich versuche, mit dem SelectionChanged-Signal eines QTreeView mit PyQt zu verbinden. Ich habe dies in der Vergangenheit (für eine QTableView) getan und war erfolgreich. Aber jetzt kann ich keinen ähnlichen Code zum Arbeiten bekommen.PyQt QTreeView: Versuch, eine Verbindung mit dem selectionChanged-Signal herzustellen

Im folgenden Codebeispiel konnte ich erfolgreich eine Verbindung zu den erweiterten und ausgeblendeten Signalen herstellen, jedoch nicht zu den selectionChanged- oder aktivierten Signalen. Kann mir jemand sagen, was ich falsch mache? Vielen Dank.

Antwort

13

Ok, herausgefunden (meist zufällig).

Da ich die Verbindungen in der init machte, aber nur das Modell für diese QTreeView später, gab es kein gültiges selectionModel vorhanden.

Um hatte, um es Arbeit zu machen ich zwei Änderungen vor:

1) Der Emissions Objekt geändert werden musste die QTreeView des selectionModel zu sein. Ich weiß nicht, warum, aber einige (selten) Beispiele auf der Bahn vorgeschlagen, dass dies der Fall sein könnte

und

2) Ich hatte die setModel Methode des QTreeView so außer Kraft zu setzen, dass er die übergeordnete Klasse ruft 'setModel Methode und macht danach die Verbindungen.

So der neue Code sieht wie folgt aus:

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

Wenn Sie deklarative verwenden Sie können, wie etwas tun:

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