Seite 1 von 1

Wie funktioniert das Signal QStandardItemModel::itemChanged

Verfasst: Mittwoch 16. September 2009, 16:16
von klaus66
Ich möchte gerne aus einem StandardItemModel ein Signal bekommen, wenn irgendein Item des Models geändert wurde. Geht sowas? Wenn ja, wie?
Das folgende jedenfalls klappt nicht!

Code: Alles auswählen

        self.connect(model3, QtCore.SIGNAL("itemChanged(item)"), self.slotTest)
model3 ist das StandardItemModel, das bei einer Änderung nach slotTest springen soll.

Mein Problem sind mehrere Tabellen (models) mit Datenbank Daten, deren Äbnderungen beim Programmende gesichert werden müssen. Zur Zeit speicher ich die kompletten Datenbankdateien ab, was sehr zeitaufwendig ist, wenn z.B. kein oder nur ein einziger Wert geändert wurde.
Hat jemand eine Idee, wie man sowas lösen kann? Wäre sehr hilfreich für mich. :wink:

Ich nutze übrigens PyQt4 mit Eric4.

Re: Wie funktioniert das Signal QStandardItemModel::itemChan

Verfasst: Mittwoch 16. September 2009, 17:02
von franzf

Code: Alles auswählen

        self.connect(model3, QtCore.SIGNAL("itemChanged(item)"), self.slotTest)
Das ist leider auch nicht korrekt. Für Signal/Slot-Argumente braucht es C++-Syntax...

Code: Alles auswählen

 self.connect(model3, QtCore.SIGNAL('itemChanged(QStandardItemModel*)'), self.slotTest)
Aber es gibt in Python noch ne bequemere Syntax:

Code: Alles auswählen

model3.itemChanged.connect(self.slotTest)
Wobei ich mich frag warum model3 kein Member deiner Klasse ist.

Verfasst: Mittwoch 16. September 2009, 17:41
von klaus66
Zunächst vilen Dank für die schnelle Antwort.

Die Variante 2 liefert nur die Fehler meldung :

Code: Alles auswählen

model3.itemChanged.connect(self.slotTest)
  • Das untersuchte Programm erzeugte die Ausnahme unhandled AttributeError
    "itemChanged"
Die Variante 1:

Code: Alles auswählen

 self.connect(model3, QtCore.SIGNAL('itemChanged(QStandardItemModel*)'), self.slotTest)
bringt zwar keine Fehlermeldung, tut aber auch nix. :(
Hab ich da was nicht kapiert?

Verfasst: Mittwoch 16. September 2009, 17:52
von franzf
Zeig mal bissl mehr Code. Insbesondere bei Variante 1 sollte schon was passieren. Wie stellst du fest ob etwas passiert?

EDIT:
ARGH natürlich im SIGNAL nicht "QStandardItemModel*" sondern "QStandardItem*". Sry, mein Fehler...

Verfasst: Mittwoch 16. September 2009, 18:07
von franzf
Ok, hab mal schnell beide connects ausprobiert, und es geht eigentlich...

Code: Alles auswählen

from PyQt4.Qt import *
import sys

class Test(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.view = QListView(self)
        self.model = QStandardItemModel(self)
        
        #beides geht:
        #self.connect(self.model, SIGNAL('itemChanged(QStandardItem*)'), self.testSlot)
        
        self.model.itemChanged.connect(self.testSlot)
        self.view.setModel(self.model)
        layout = QHBoxLayout(self)
        layout.addWidget(self.view)
        self.model.setItem(0,0,QStandardItem("Hello"))
    
    def testSlot(self):
        print "SLOT ACTION!!!"

app = QApplication(sys.argv)
w = Test()
w.show()
app.exec_()
Beide connects funktionieren.

Verfasst: Mittwoch 16. September 2009, 18:20
von lunar
Die von franzf gezeigte alternative Syntax funktioniert erst ab PyQt 4.5.

Verfasst: Donnerstag 17. September 2009, 07:17
von klaus66
Danke für Eure Tips!
Es funktioniert, allerdings nur Variante1 mit Korrektur. :)
Luna hat wohl recht, die Variante 2 funktioniert jedenfalls nicht mit meiner PyQt4.4.4 Version. Das ist die aktuell von Ubuntu unterstützte Version.

Verfasst: Donnerstag 17. September 2009, 08:00
von klaus66
So ganz bin ich immer noch nicht zufrieden!

Jetzt bekomme ich zwar die Änderung mit, bekomme auch den neuen Inhalt und den Index der geänderten Zelle.

Um diese Änderung nun in meine Datenbank einzuschleusen, bräuchte ich praktischerweise die Zeilennummer des Models, in der die Änderung vorgenommen wurde. Ich finde einfach keine Methode, um aus einem Index row und column zu extrahieren.
Kann mir da mal jemand weiterhelfen?

Verfasst: Donnerstag 17. September 2009, 08:31
von franzf
klaus66 hat geschrieben:Um diese Änderung nun in meine Datenbank einzuschleusen, bräuchte ich praktischerweise die Zeilennummer des Models, in der die Änderung vorgenommen wurde. Ich finde einfach keine Methode, um aus einem Index row und column zu extrahieren.
Kann mir da mal jemand weiterhelfen?
Kann natürlich sein, dass das jetzt wieder an der Version liegt...
Aber bei mir (PyQt4-4.5.4) gibt es

* QStandardItem::row()
* QStandardItem::column()
* QStandardItem::index()
* * QModelIndex::row()
* * QModelIndex::column()

Und das funktioniert hier sogar :)

Verfasst: Donnerstag 17. September 2009, 10:21
von klaus66
Nein, es klappt tatsächlich auch mit der 4.4 Version. :D

Ich frag mich nur, warum hab ich das nicht gefunden? Oder andersherum, es würde mich interessieren, wo man diese Methode findet.

Danke für die prompte Hilfe!

Verfasst: Donnerstag 17. September 2009, 10:27
von klaus66
klaus66 hat geschrieben:Nein, es klappt tatsächlich auch mit der 4.4 Version. :D

Ich frag mich nur, warum hab ich das nicht gefunden? Oder andersherum, es würde mich interessieren, wo man diese Methode findet.

Danke für die prompte Hilfe!
PS: schon erledigt, ich hab es gefunden in der QStandardItem Klasse. Eigentlich logisch. Wer suchet, der findet! :wink:

Verfasst: Donnerstag 17. September 2009, 11:55
von lunar
@klaus66: Lunar, bitte ;)

Falls Deine Datenbank eine SQL-Datenbank ist, solltest Du Dir auch mal die fertigen Modell-Klassen aus dem QtSQL-Modul ansehen.