pyqt4: Signal QAbstractIemView.currentChanged

17/06/2013 - 21:20 von Wolfgang Meiners | Report spam
Hallo Gruppe,

Ich habe in einem Programm zwei TreeViews (TreeView_Gruppe,
TreeView_Element), die sich aufeinander beziehen. Immer dann, wenn sich
die aktuelle Gruppe àndert, sollen die zur Gruppe gehörigen Elemente
angezeigt werden. Das funktioniert im Prinzip mit folgender
Programmstruktur: (nur der relevante Teil:)



class DBDialog(QDialog, ui_elemente.Ui_DBDialog):

def __init__(self, parent=None):
super(DBDialog, self).__init__(parent)
self.setupUi(self)
# Die Daten kommen aus einer Datenbank
# die per SqlAlchemy angesprochen wird
gruppenListe = \
session.query(Gruppe).filter(Gruppe.parent_id == None).all()
gruppenTreeModel = GruppenTreeModel(gruppenListe=gruppenListe)
self.treeView_Gruppen.setModel(gruppenTreeModel)
self.treeView_Gruppen.header().\
setResizeMode(QHeaderView.ResizeToContents)

elementTreeModel = ElementTreeModel(gruppenListe[0])
self.treeView_Element.setModel(elementTreeModel)
self.treeView_Element.header().\
setResizeMode(QHeaderView.ResizeToContents)

######################################################
# hier wirds interessant
######################################################
self.connect(self.treeView_Gruppen,
SIGNAL("pressed(QModelIndex)"),
self.update_treeView_Element)

def update_treeView_Element(self, index):
gruppe = index.internalPointer()
print(gruppe)
elementTreeModel = ElementTreeModel(gruppe)
self.treeView_Element.setModel(elementTreeModel)

Das funktioniert solange, wie ich im GruppenTree auf eine Gruppe klicke,
aber nicht, wenn ich die aktuelle Gruppe mit der Tastatur auswàhle. Mein
Versuch

self.connect(self.treeView_Gruppen,
SIGNAL("currentChanged(QModelIndex, QModelIndex)"),
self.update2_treeView_Element)

mit
def update2_treeView_Element(self, current, previous):
gruppe = current.internalPointer()
print(gruppe)
elementTreeModel = ElementTreeModel(gruppe)
self.TreeView_Element.setModel(elementTreeModel)

funktioniert nicht, die Funktion update2_treeView_Element wird gar nicht
erst aufgerufen. Weiß jemand, wie man das richtig macht?
Ich habe mich an die PyQt Dokumentation gehalten, dort steht:

QAbstractItemView.currentChanged (self, QModelIndex current, QModelIndex
previous)

This method is also a Qt slot with the C++ signature void
currentChanged(const QModelIndex&,const QModelIndex&).

This slot is called when a new item becomes the current item. The
previous current item is specified by the previous index, and the new
item by the current index.

If you want to know about changes to items see the dataChanged() signal.

Danke für alle Tipps
Wolfgang
 

Lesen sie die antworten

#1 Wolfgang Meiners
17/06/2013 - 23:01 | Warnen spam
Problem gelöst!
Hier die Lösung (obwohl ich sie noch nicht bis in die kleinste
Einzelheit verstehe)

self.connect(self.treeView_Gruppen.selectionModel(),
SIGNAL("currentChanged(QModelIndex, QModelIndex)"),
self.update2_treeView_Element)

mit
def update2_treeView_Element(self, current, previous):
gruppe = current.internalPointer()
print(gruppe)
elementTreeModel = ElementTreeModel(gruppe[0])
self.TreeView_Element.setModel(elementTreeModel)

obwohl das Signal currentChanged(QModelIndex,QModelIndex) ist, ist
gruppe ein Tupel. Das ist mir zwar nicht ganz klar, aber es funktioniert
nun so, wie ich will - bis auf meine Darstellungsfehler, aber das ist
ein anderer Thread und ein anderes Thema

Wolfgang

Ähnliche fragen