Ich muss nun wohl doch mal eine Frage stellen, da ich einfach den Wald vor lauter Bäumen nicht mehr sehe und einfach nicht weiter komme.
Ich arbeite schon etwas länger mit Python (unter Linux mit Gnome), habe Qt aber erst vor kurzem für mich entdeckt - und lieben gelernt.

Mein Problem ist nun Folgendes:
Ich habe eine MySQL-Tabelle, aus der zwei Spalten in einem Tree angezeigt werden sollen. (Nein, das ist noch nicht das Problem.)
Also, die Tabelle sieht so aus:
| id | item | desc | sortorder |
In "item" stehen die Aufgaben, in "desc" die zugehörigen Beschreibungen. "id" ist der automatisch gesetzte Schlüssel und "sortorder" ist im Moment noch nicht wichtig, soll später mal die Aufgaben sortieren.
Das Ganze wird eine ToDo-Liste, die von mehreren Leuten übers Internet genutzt und aktualisiert wird.
Die Darstellung sieht dann so aus:

Die Zeilen einer Beschreibung sind in der Datenbank durch Zeilenumbruch getrennt und werden dann im Programm gesplittet. Unter der Beschreibung ist dann noch ein leeres Item, das nicht aus der Datenbank kommt, um einen neuen Eintrag vornehmen zu können. Und ganz unten noch ein von der Datenbank unabhängiges Item für eine neue Aufgabe.
So weit klappt das alles schon. Der Screenshot ist brav mit Einträgen aus der Datenbank gefüllt.
Nun das Problem:
Der User soll per Doppelklick die Einträge ändern können. Geht ja. Dann sollen aber die geänderten Einträge in der Datenbank aktualisiert, bzw. neue Einträge eingefügt werden.
Das Signal, dass überhaupt etwas geändert wurde, funktioniert.
Nur möchte ich auch wissen, WAS geändert wurde, um das an die Datenbank weiter reichen zu können.
Die Frage ist also: Wie kriege ich das geänderte Item und seinen neuen Wert heraus?
Es tut mir Leid, wenn das eine selten dämliche Frage ist. Ich sehe nur, wie gesagt, den Wald vor lauter Bäumen nicht, lese über QTreeView, QTreeWidget, QAbstractItemView und so weiter. Aber ich krieg es einfach nicht zusammen. Ich suche eigentlich nach einem Beispiel-Code, der mir zeigt, wie das geht, aber ich finde einfach keinen. Vielleicht bin ich auch gerade einfach nur zu doof zum Suchen, denn das Problem muss doch bestimmt schon mal jemand gehabt haben. Oder es ist so einfach, dass sich einfach niemand die Frage stellt. Ich weiß es nicht. Ich bin auch einfach so zugeflutet mit zusammenhanglosen Informationen aus der Dokumentation oder unterschiedlichen Codes, dass ich einfach nichts mehr sortiert kriege. Ich glaube, es wird bestimmt was mit QAbstactItemView zu tun haben, aber ich weiß nicht mal, wie ich das mit den Items verknüpfen soll oder wie es dann weiter geht. Oder es will mir grad einfach nicht in den Schädel. Also falls die Frage zu dämlich ist, entschuldigt bitte, aber ich komm da grad echt nicht mit klar, obwohl ich mir wirklich Mühe gebe.
Hier mal der relevante Ausschnitt aus meinem Code:
Code: Alles auswählen
def itemTable(self):
ItemWidget = QtGui.QTreeView()
ItemModel = QtGui.QStandardItemModel()
result = db.query("SELECT * FROM items ORDER BY sortorder")
for i in xrange(result.num_rows()):
row = result.fetch_row()
Id, Item, ItemDesc, ItemOrder= row[0]
TreeItem = QtGui.QStandardItem(Item)
ItemModel.appendRow(TreeItem)
ItemDesc = ItemDesc.split('\r\n')
for desc in ItemDesc:
TreeItemDesc = QtGui.QStandardItem(desc)
TreeItem.appendRow(TreeItemDesc)
TreeItem.emitDataChanged()
TreeItemDesc = QtGui.QStandardItem('')
TreeItem.appendRow(TreeItemDesc)
TreeItem = QtGui.QStandardItem('<Neue Aufgabe>')
ItemModel.appendRow(TreeItem)
#self.connect(ItemModel, QtCore.SIGNAL('itemChanged()'), self.updateItemDesc)
#self.connect(ItemWidget, QtCore.SIGNAL('doubleClicked(const QModelIndex &)'), self.updateItemDesc)
self.connect(ItemWidget, QtCore.SIGNAL('doubleClicked(const QModelIndex &)'), self.test1)
self.connect(ItemModel, QtCore.SIGNAL('itemChanged(QStandardItem *)'), self.test2)
#TreeItemDesc = QtGui.QStandardItem('<Neue Beschreibung>')
#TreeItem.appendRow(TreeItemDesc)
ItemModel.setHorizontalHeaderLabels([self.tr(u'Aufgaben')])
ItemWidget.setModel(ItemModel)
self.ItemArea = ItemWidget
def test1(self):
print 'Doppelklick'
def test2(self):
print 'Geändert'
Das Signal mit dem Doppelklick steht da nur zu Testzwecken. Das und das itemChanged-Signal funktionieren.
Falls ihr euch fragt, warum ich denn die Items nicht im self hab oder in einer Liste, ich hab da schon dran gedacht. Aber ich wollte jetzt erst mal gucken, wie das überhaupt geht mit der Wertübergabe, bevor ich vorschnell was mit einer ggf. unnützen Liste oder mit self mache (dachte, das würde sich dann bestimmt ergeben). Und lasst euch nicht von den Worten "itemTable" und "ItemWidget" irritieren. Ich hab schon mehrere Sachen probiert, bevor ich mich für den Tree entschieden hab und hatte da auch zuerst ein QTreeWidget stehen gehabt.
Es wäre schön, wenn mir jemand durch ein bisschen Code oder einen vielsagenden Link mal ein bisschen eine Richtung zeigen könnte. Oder einfach einen Tipp, wonach ich mal suchen sollte.
P.S.: Tut mir Leid, wenn mein Beitrag wirr oder unverständlich sein sollte oder wichtige Informationen fehlen. Ich reiche da gerne was nach. Ich bin nur gerade so geflutet, dass ich froh bin, wenn ich mein Problem hier halbwegs klar herausgearbeitet kriege. Ich liefere auf Wunsch auch noch zum Ausprobieren einen benutzbaren Beispiel-Code, der sich die Daten nicht aus der Datenbank fischt. Ansonsten gibt es jetzt erst mal wenigstens einen Screenshot.
P.P.S.: Wie gesagt, ich nutze Gnome. Von daher wäre es toll, wenn es eine Lösung gäbe, die auch ohne KDE-Bibliothen und sowas auskommt.