Seite 1 von 1

PyQt4, Slots and Signals...

Verfasst: Mittwoch 7. Mai 2008, 09:25
von kompensator
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!

Verfasst: Mittwoch 7. Mai 2008, 09:38
von Hyperion
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 ;-)

Verfasst: Mittwoch 7. Mai 2008, 09:57
von kompensator
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:

Verfasst: Mittwoch 7. Mai 2008, 10:09
von Hyperion
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 ...

Verfasst: Mittwoch 7. Mai 2008, 14:26
von kompensator
hab jetzt nochmal nachgeprüft: print type(self.layer) ergibt auf der Konsole

<class 'qgis.core.QgsVectorLayer'>

was mach ich bloß falsch?

Verfasst: Montag 12. Mai 2008, 09:08
von kompensator
ok, falls noch wer das problem haben sollte - ich habs nur mit nem workaround lösen können und benutz ein anderes signal...