Qt4 , Frage zu QtCore.Slots

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
ridix
User
Beiträge: 3
Registriert: Mittwoch 19. August 2009, 13:11

Hey

ich hab jetzt angefangen mit Python Qt Programmierung , nachdem ich vorher Java und C programmiert habe .
Obwohl die Qt Doku doch sehr sehr gut ist habe ich meine Probleme mit den Events.
hier mal ein kleiner sample code :

Code: Alles auswählen

import sys
from PyQt4 import QtCore, QtGui

class oberflaeche(QtGui.QMainWindow):
        def __init__(self):
                QtGui.QMainWindow.__init__(self)
                self.setGeometry(100,100,300,300)

                self.list = QtGui.QListWidget(self)
                self.list.setGeometry(0,0,300,200)

                self.button = QtGui.QPushButton("addItem",self)
                self.button.setGeometry(100,250,120,40)
                self.connect(self.button,QtCore.SIGNAL('clicked()'),self.addItem)
                self.show()

        def addItem(self):
                self.list.addItem("BlaBla")

app = QtGui.QApplication(sys.argv)
p = oberflaeche()
sys.exit(app.exec_())
Wie sicherlich leicht erkennbar ist habe ich ein Fenster mit nem ListView erstellt , sowie einem Button.
Immer wenn jetzt auf den Button gedrückt wird soll ein neuer Eintrag hinzugefügt werden. Normalerweise würde ich die addItem Methode noch mit einem zusätzlichen Attribut ausstatten, die dann den neuen Text an den addItem Methode des ListViewWidgets übergibt . Wenn ich das jetzt aber so mache bekomme ich immer eine Fehlermeldung das das letzte Attribut der connect Methode vom falschen typ ist. Was mache ich da genau falsch?
Danke für eure Hilfe.
lunar

Dein Fehler ist vor allem, dass Du nicht die genaue Fehlermeldung zeigst ;) Auf den ersten Blick sehe ich auch keinen Fehler, daher wäre diese Fehlermeldung durchaus wichtig.

Aufgefallen ist mir allerdings, dass du ".show()" im Konstruktor aufrufst, und absolute Positionierungen und Größen verwendest. Beides sollte man nicht tun. ".show()" solltest Du von "außerhalb" aufrufen, statt absoluter Positionen und Größen sollltest Du einen passenden Layoutmanager verwenden (siehe das korrigierte Beispiel).
ridix
User
Beiträge: 3
Registriert: Mittwoch 19. August 2009, 13:11

erstmal danke für das Anpassen . Ich habe die addItem Methode mal so erweitert wie ich es eigentlich wollte quasi :

Code: Alles auswählen

....
        self.button.clicked.connect(self.addItem('blabla'))

    def addItem(self,text):
        self.list.addItem(text)
......

jetzt beomme ich folgende Meldung :
self.button.clicked.connect(self.addItem('blabla'))
TypeError: connect() slot argument should be a callable or a signal, not 'NoneType'
Laut Fehlermeldung muss jedes Slot-Argument eine aufrufbare Methode oder eben ein Signal sein.
Wo ist jetzt der Fehler?

edit :
Wie du ja sicherlich gesehen hast fehlt mir definitiv das wissen für pyqt4 weil ich eben erst angefangen habe. Gibt es gute Dokumentationen bzw Tutorials dazu? Bisher hatte ich eins von hier
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du musst eine Methode/Funktion uebergeben und nicht deren Rueckgabewert, d.h. du solltest sie nicht aufrufen. Wenn du Parameter an sie binden willst, schau dir mal `functools.partial` an.

PyQt Doku: http://www.riverbankcomputing.co.uk/
Qt Doku (PyQt ist nur ein duenner Wrapper darueber): http://doc.trolltech.com/
ridix
User
Beiträge: 3
Registriert: Mittwoch 19. August 2009, 13:11

ok, danke euch beiden!
Antworten