PyQt4, Slots and Signals...

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
kompensator
User
Beiträge: 7
Registriert: Mittwoch 7. Mai 2008, 08:40

PyQt4, Slots and Signals...

Beitragvon kompensator » Mittwoch 7. Mai 2008, 09:25

Hallo verehrte Entwicklergemeinde,

ich schreibe gerade ein kleines Plugin für Quantum GIS und muss dafür zum ersten mal mit Python und Qt arbeiten. Das Konzept der Slots und Signals gefällt mir eigentlich ganz gut, aber irgendwas scheine ich noch nicht richtig zu begreifen, hier mal ein paar snippets:

Code: Alles auswählen

self.layer = self.iface.activeLayer()
        if self.layer.type() == QgsMapLayer.VECTOR:
            QObject.connect(self.layer, SIGNAL("selectionChanged()"), self.showSelected)


Code: Alles auswählen

def showSelected(self):
        layer = self.iface.activeLayer()
        featureIDs = layer.selectedFeaturesIds()
        for id in featureIDs:
            print id


ich hoffe dass das an Informationen reicht, sonst kann ich nochmal ein paar Auszüge aus der QGIS-Api nachreichen.
Jedenfalls erscheint beim testen jedesmal folgende Fehlermeldung:

Code: Alles auswählen

An error has occured while executing Python code:

Traceback (most recent call last):
File "/home/georg/.qgis//python/plugins/grassify/GrassifyPlugin.py", line 45, in run
  hp = HarrisParser(self.iface, self.iface.getMainWindow())
File "/home/georg/.qgis//python/plugins/grassify/HarrisParser.py", line 64, in __init__
  QObject.connect(self.layer, SIGNAL("selectionChanged()"), self.showSelected)
TypeError: argument 1 of QObject.connect() has an invalid type


ich hoffe jemand kann mir helfen, ich habe wirklich keine Ahnung warum Argument 1 einen falschen Typus haben soll...
Danke schonmal!
Zuletzt geändert von kompensator am Mittwoch 7. Mai 2008, 10:02, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Mittwoch 7. Mai 2008, 09:38

Was für einen Typ hat den self.layer? Ist das auch ein QObject? (Iirc haben ja nur QObjects Signals und Slots).

Der Test auf "== 0" sieht so nicht ganz sauber aus ehrlich gesagt - dafür gibts doch sicherlich ne Modul-Variable! Aber das nur am Rande ;-)
kompensator
User
Beiträge: 7
Registriert: Mittwoch 7. Mai 2008, 08:40

Beitragvon kompensator » Mittwoch 7. Mai 2008, 09:57

Hyperion hat geschrieben:Was für einen Typ hat den self.layer? Ist das auch ein QObject? (Iirc haben ja nur QObjects Signals und Slots).


hmm, weiss ehrlich gesagt nicht so genau aber in der API werden Slots und Signals gelistet, wofür währen die denn sonst da?

http://svn.qgis.org/api_doc/html/classQgsMapLayer.html

Mal angenommen es liegt wirklich daran, könnte ich mir dann sone Art Wrapper QObject basteln, das von QgsVectorLayer erbt?
Das mit der Modulvariablen hab ich gerade mal angepasst, danke für den Hinweis! :wink:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Mittwoch 7. Mai 2008, 10:09

Du hast Recht - ich vermisse zwar den Hinweis in der API, dass das von QObject erbt, aber da da SIGNALS uns SLOTS gelistet werden, sollte man davon ausgehen. Dennoch merkwürdig, wieso dann wegen des Typs gemeckert wird ...
kompensator
User
Beiträge: 7
Registriert: Mittwoch 7. Mai 2008, 08:40

Beitragvon kompensator » Mittwoch 7. Mai 2008, 14:26

hab jetzt nochmal nachgeprüft: print type(self.layer) ergibt auf der Konsole

<class 'qgis.core.QgsVectorLayer'>

was mach ich bloß falsch?
kompensator
User
Beiträge: 7
Registriert: Mittwoch 7. Mai 2008, 08:40

Beitragvon kompensator » Montag 12. Mai 2008, 09:08

ok, falls noch wer das problem haben sollte - ich habs nur mit nem workaround lösen können und benutz ein anderes signal...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder