PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (Verständnis-) Problem mit Signal-Slot



samufi
20-12-2011, 10:15
[Ich benutze PyQt4 mit Python3.0]

Hallo liebe Wissende,
ich habe auf einer Form ein QTableWidget mit zwei Spalten und einer Zeile. Da versuche ich gerade eine Möglichkeit zu schaffen, eine neue Zeile hinzuzufügen. Dazu habe ich zwei Möglichkeiten probiert, die wohl beide wegen desselben Fehlers nicht funktionierten: Einmal die ganz klassische, bei der beim Klick auf einen Button eine Zeile hinzugefügt wird oder die elegantere Möglichkeit, dass, wenn ein neues Feld zum Schreiben "betreten wird" geschaut wird, ob die letzte Zeile Zeile leer ist - und wenn nicht, eine neue Zeile hinzugefügt wird.
Ich habe versucht das folgendermaßen zu implementieren: (mit einem Button - wenn ich das hinbekomme, dürfte die andere Variante ja kein Problem sein, wenn ich das richtige Signal (!) kennen würde)


class GrForm(QtGui.QWidget):
def __init__(self, parent = None):
QtGui.QWidget.__init__(self, parent)

self.setWindowTitle('Daten eingeben')

grid = QtGui.QGridLayout()
grid.setSpacing(10)

#hier kommt dann noch anderer Kram, der gerade uninteressant ist

tNummern = QTableWidget()
grid.addWidget(tNummern, 3, 0)

bNeueZeileL = QtGui.QPushButton('test', self)
grid.addWidget(bNeueZeileL, 4, 0)
QObject.connect(bNeueZeileL, SIGNAL('clicked()'), tNummern, SLOT('insertRow(0)'))

self.setLayout(grid)

Leider Passiert bei dieser Variante einfach nichts. Ich habe es auch mal mit einer eigenen Subklasse "NrTabelle" von QTableWidget probiert, der ich eine Zeilenanfügemethode "nZ()" (ohne Parameter) hinzugefügt habe - dort kam die Fehlermeldung, dass "Object::connect: No such slot NrTabelle::nZ()"
Ich habe sehr lange alle möglichen Foren und Tutorials durchforstet, aber keine Lösung gefunden. Ich nehme an, dass es bei meinem Verständnis hapert und würde mich über erklärende Hilfe freuen =).
Herzliche Grüße,
Samufi

undefined
20-12-2011, 14:47
Du bist im falschen Foren Bereich das ist Python.
Dein Fehler liegt am Aufruf.
Du kannst nicht einem Signal mit Leeren Körper auf eine Methode Interpretieren die ein Argument verlangt.


QObject.connect(bNeueZeileL, SIGNAL('clicked()'), this, SLOT('meineNeueMethode()'))

in der Methode/SLOT oder Funktion die Parameter an insertRow übergeben.
http://developer.qt.nokia.com/doc/qt-4.8/signalsandslots.html

samufi
20-12-2011, 17:52
Danke für die Antwort! =) Ist es möglich, den Thread noch zu verschieben?
Ich habe jetzt versucht, deinen Tipp umzusetzen:


class miniTabelle(QTableWidget):
"""
Kleien Tabelle
"""
def __init__(self, Spalten):
"""
Constructor
"""
#hier steht dann der Construktorcode

def nZ(self):
"""
Methode zum anfügen einer Zeile, die mit dem Signal verknüpft werden soll
"""
self.insertRow(0)


class GrForm(QtGui.QWidget):
"""
Klasse der Form, auf der ich den Button und die Tabelle erstellen möchte
"""
def __init__(self, parent = None):
"""
Constrictor
"""
QtGui.QWidget.__init__(self, parent)

grid = QtGui.QGridLayout()
grid.setSpacing(10)

#hier kommt dann noch anderer Kram, der gerade uninteressant ist

tNummern = miniTabelle()
grid.addWidget(tNummern, 3, 0)

bNeueZeileL = QtGui.QPushButton('test', self)
grid.addWidget(bNeueZeileL, 4, 0)

#hier liegt der Hase im Pfeffer
QObject.connect(bNeueZeileL, SIGNAL('clicked()'), tNummern, SLOT('nZ()'))

self.setLayout(grid)

Mit "this" hat der Interpreter gemeckert, die globale Variable wäre nicht definiert. Und so wie es da steht bekomme ich die Fehlermeldung "Object::connect: No such slot miniTabelle::nZ()"
Danke übrigens für den Link, das ist die ausführlichste Dokumentation, die ich bisher gesehen habe - aber ich habe keine wirklich Lösung für mein Problem gefunden.
Muss ich eventuell die Definition meines Slots noch spezialisieren? Oder ist mein Aufruf immer noch falsch?
Vielen Dank für deine Hilfe!

anda_skoa
20-12-2011, 18:33
Probier es mal mit dem pyqtSlot Decorator http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html

bzw. mit dem alternativen connect


bNeueZeile.clicked.connect(tNummern.nZ)


Ciao,
_

samufi
20-12-2011, 18:58
Super, das funktioniert! :) Geht das dann bei allen Signalen?
Und wenn ich jetzt die andere Variante versuchen wollte, dass die neue Zeile beim "Eintreten" oder "Verlassen" einer Zelle passiert - welches Signal könnte ich benutzen? (Ich hatte es zuerst mit dem Überschreiben von vorhandenen Ereignismethoden versucht, da aber leider nicht das passende Ereignis gefunden)
Vielen Dank für die Hilfe!!

samufi
20-12-2011, 19:51
Ich hab jetzt auch die andere Variante hingekriegt (in die Tabellenklasseninitialisierungsmethode "self.cellChanged.connect(self.nZ)") eingefügt - und es funktioniert super.
Nun bleibt nur noch die Frage, ob ich jemals, die andere Connect-Variante benötige oder ob ich alles mit der deutlich einfacheren Möglichkeit machen kann...

anda_skoa
21-12-2011, 19:01
Super, das funktioniert! :) Geht das dann bei allen Signalen?

Ich denke das geht mit allen Signalen, aber ich habe selbst mir PyQt noch nie was gemacht.
Dennoch gehe ich davon aus, dass das klappt, soweit ich weiß macht das Qt/JavaScript Modul das auch.

Ciao,
_