QT: Signal/Slot Frage

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
romulus
User
Beiträge: 7
Registriert: Freitag 22. August 2003, 13:13

Hallo!

Also ich bin ganz neu bei Python und auch bei QT. Ich hab ein bisschen Delphi Erfahrung, weshalb es mir das Signal/Slot Konzept angetan hat, in Delphi funktioniert das nämlich ganz ähnlich.

Nun zu meinem (Anfänger) Problem, das ich trotz dieses Buches nicht gebacken bekomme. Ist übrigens nur zum üben, kein richtiges Projekt.

Folgender Beispielcode

Code: Alles auswählen

class TreeView(QListView):

    def showxml(self, item):
	    print item.text

    def __init__(self, *args):
        apply(QListView.__init__,(self, ) + args)

	     self.connect(self, SIGNAL("selectionChanged(QListViewItem *)"), self.showxml)        


def main(args):
    
        app = QApplication(sys.argv)

        QObject.connect(app, SIGNAL('lastWindowClosed()'),
                        app, SLOT('quit()'))
        w = TreeView()
        app.setMainWidget(w)
	
	s=open("auftrag.xml").read() //
        p.start(s)                              //hier wird das Treeview gefüllt, Code nicht enhalten, funktioniert aber soweit

        w.show()
        app.exec_loop()

if __name__=="__main__":
    main(sys.argv)
(die Einrückungen klappen nicht so recht, aber ich denke ihr wisst wie ihr den Code lesen müsst)

Das Problem hierbei ist das verbinden des Signals selectionChanged(QListViewItem *) mit meinem Slot "showxml". In der Form wie er oben steht, frisst es der Interpreter ohne Fehlermeldung, allerdings zeigt "print item.text" nur folgende Ausgabe:

Code: Alles auswählen

"<built-in method text of sip.wrapper object at 0x009274C0>"
Woran liegt das? Bei Recherchen mit Google hab ich noch folgende Variante gefunden, Signal und Slot zu verbinden:

Code: Alles auswählen

self.connect(self, SIGNAL("selectionChanged(const QListViewItem &)"), self.showxml)
allerdings meckert Python dann beim interpretieren mit folgender FM:

Code: Alles auswählen

self.connect(self, SIGNAL("selectionChanged(const QListViewItem &)"), self.showxml)        
RuntimeError: Signal has wrong argument types for slot
Wie kann ich also das Signal selectionChanged so mit dem slot verbinden, dass der Slot das aktuelle Item übergeben wird und ich mittels QListViewItem.text auf den Inhalt dieses Items zugreifen kann?

Das ganze ist übrigens Python 2.3 unter Windows mit PyQT 3.8 NC

Ciao
Romulus
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi romulus,

zum ersten Fehler, versuchs mal mit

Code: Alles auswählen

print item.text()
Du hast einfach die Klammern vergessen. item.text ist laut der Fehlermeldung eine Methode von item und kein Attribut.

Zum Rest kann ich Dir leider nicht helfen, da ich weder mit Windows noch mit qt erfahrung habe.


Gruß

Dookie
romulus
User
Beiträge: 7
Registriert: Freitag 22. August 2003, 13:13

oh Mann das wars! So einfach können die Dinge des lebens sein :)

Bin halt noch an Pascal gewöhnt, da brauchte man diese Klammern nicht ...
romulus
User
Beiträge: 7
Registriert: Freitag 22. August 2003, 13:13

ach ne Frage hätte ich noch. Was ist denn den Unterschied zwichen den folgenden Statements und wann und wie werden sie eingesetzt:

Code: Alles auswählen

self.connect(self, SIGNAL("selectionChanged(QListViewItem *)"), self.showxml)
self.connect(self, SIGNAL("selectionChanged(const QListViewItem &)"), self.showxml)
Ich meine, was macht denn das Sternchen? Und was der Ampersand? Und wozu ist das gut?

Wäre nett wenn mir das noch jemand beantworten könnte :)
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

romulus hat geschrieben:Ich hab ein bisschen Delphi Erfahrung, weshalb es mir das Signal/Slot Konzept angetan hat, in Delphi funktioniert das nämlich ganz ähnlich.
Hallo Leidensgenosse.... ;)
romulus hat geschrieben: Nun zu meinem (Anfänger) Problem, das ich trotz dieses Buches nicht gebacken bekomme. Ist übrigens nur zum üben, kein richtiges Projekt.
Das ist im designer etwas tricki...

. Dann erzeugst du die Slots (die Prozeduren wie onClick.....)
  • * Zuerst machst du im designer deine Maske fertig
    * Slots (Prozeduren wie onClick....) im Formular erzeugen
    * ConnectiongTool starten (rot/grüner Pfeil),
    * das Element anklicken, von welchem die Aktion ausgehen soll und mit gedrückter Maustaste auf das Formular ziehen
    * und mit dem Slot verbinden.
    *
    *
    * die ...ui Datei mi pyuic nach ....py übesetzen
    * einbinden
    * und fertig
Ich hoffe du verstehst die Klickanleitung. Sonst noch mal melden.

Wäre eigentlich mal was für ne Doku. [/list]
Gast

ah so kann man sich das zusammenklicken! Sieht ja schonmal sehr interessant aus. Und ja ich hab es verstanden. Danke! :)

Der benutzt aber auch diese Konstrukte wie ich oben schonmal gefragt habe. Kannst du mal kurz erklären, was dieses * bedeutet oder wann man "const ... &" angeben muss?
romulus
User
Beiträge: 7
Registriert: Freitag 22. August 2003, 13:13

grr nicht eingeloggt ;) das da oben ist von mir
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

romulus hat geschrieben:ah so kann man sich das zusammenklicken! Sieht ja schonmal sehr interessant aus. Und ja ich hab es verstanden. Danke! :)
....... Wunder, es versteht mich einer! ..... :mrgreen:

Ich halte das immer so, dass ich mir das Formular zusammenklicke, das dann per import in das Programm einbinde und eine Klasse ableite. Und in der Anleitung selbst erstelle ich dann den Code für die definierten Slots.
romulus hat geschrieben: Der benutzt aber auch diese Konstrukte wie ich oben schonmal gefragt habe. Kannst du mal kurz erklären, was dieses * bedeutet oder wann man "const ... &" angeben muss?
Aua, das ist was für die Spezialisten. Riecht nach Pointer oder so. Bevor ich was falsches erzähle, lasse ich lieber die Spezialisten ran.

Bei Strings mußt du aufpassen. QT benutzt meistens QString. Der benutzt m. E. UTF8 Code. Wenn du den QString in eine Datei auf einem ISO8859-15 System speichern willst, gibts schon mal Stress. da Gibts Funktionen wie local8Bit () im Modul QString für die Konvertierung.

Die Onlinedoku zu QT kann ich nur empfehlen. (http://doc.trolltech.com/3.1 )
Antworten