Wie funktioniert das Signal QStandardItemModel::itemChanged

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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.
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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.
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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?
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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...
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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.
lunar

Die von franzf gezeigte alternative Syntax funktioniert erst ab PyQt 4.5.
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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.
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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?
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

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 :)
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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!
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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:
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
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.
Antworten