QTableWidget mit QComboBoxen, Änderungen registrieren?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Hallo zusammen,
ich habe folgendes Problem: Ich habe eine Tabelle erstellt, in der ich die Zellen mit setCellWidget zu ComboBoxen umfunktioniert habe. Ich möchte nun die Tabelle beim Verlassen des Fensters speichern, wenn etwas geändert wurde. Das tableWidget reagiert aber verständlicherweise auf eine Änderung einer ComboBox nicht. Das Problem ist, dass ich nicht jede ComboBox mit einem connect versehen will und kann, da diese innerhalb einer for-Schleife angelegt werden.

Code: Alles auswählen

def notenSetzen(self):
        zeile = 0
        for notenliste in self.noten:
            	spalte = 0
            	for item in notenliste:
			newitem = QtGui.QComboBox()
			newitem.insertItems(0,self.kurs.notenstufen()) 		
			self.tableWidget.setCellWidget(zeile,spalte,newitem)
                	spalte += 1
        	zeile += 1
Hintergrund dieser Anordnung: Die Anwendung soll ein Notenbuch fürs N900 abbilden, wo der Benutzer beim Klicken auf eine Zelle eine Auswahl an Notenstufen erhält, also 1+ ,1 , 1-, ...
noten enhält jeweils die Notenliste einzelner Schüler des Kurses.
Hat jemand eine Idee oder eine alternative Möglichkeit?
Gruß
EmaNymton
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Mal wieder wer suchet der findet :D

Stichwort war QSignalMapper. Der Code sieht jetzt so aus

Code: Alles auswählen

def notenSetzen(self):
        zeile = 0
        for notenliste in self.noten:
            	spalte = 0
            	for item in notenliste:
                        newitem = QtGui.QComboBox()
                        newitem.insertItems(0,self.kurs.notenstufen())
                        self.connect(newitem, QtCore.SIGNAL("currentIndexChanged(int)"), self.signalMapper, QtCore.SLOT("map()"))
                        self.signalMapper.setMapping(newitem,item)
                        self.tableWidget.setCellWidget(zeile,spalte,newitem)
                        spalte += 1
         zeile += 1
und das ganze wird dann noch außerhalb der Methode mit

Code: Alles auswählen

self.connect(self.signalMapper,QtCore.SIGNAL("mapped(int)"),self.tableWasModified)
verbunden.

Vielleicht hilfts ja jemandem, der ein ähnliches Problem hat.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich meine mich zu erinnern, dass man das Pythonischer lösen konnte! Ich muss mal zu Hause in altem Code wühlen, wo ich einen Lösungsansatz von Lunar mal umgesetzt hatte.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

@Hyperion: Man kann im Allgemeinen jede Anwendung von QSignalMapper durch partielle Funktionen ersetzen. Partielle Funktionen kann man entweder mit lambda oder mit functools.partial erzeugen.
Antworten