Anzeige:
Ergebnis 1 bis 7 von 7

Thema: (Verständnis-) Problem mit Signal-Slot

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.05.2011
    Beiträge
    11

    (Verständnis-) Problem mit Signal-Slot

    [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)
    Code:
    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

  2. #2
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    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.
    Code:
    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...sandslots.html
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.05.2011
    Beiträge
    11
    Danke für die Antwort! =) Ist es möglich, den Thread noch zu verschieben?
    Ich habe jetzt versucht, deinen Tipp umzusetzen:
    Code:
    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!

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Probier es mal mit dem pyqtSlot Decorator http://www.riverbankcomputing.co.uk/...als_slots.html

    bzw. mit dem alternativen connect
    Code:
    bNeueZeile.clicked.connect(tNummern.nZ)
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    09.05.2011
    Beiträge
    11
    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!!

  6. #6
    Registrierter Benutzer
    Registriert seit
    09.05.2011
    Beiträge
    11
    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...

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von samufi Beitrag anzeigen
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •