Signals from Processing Framework

Issue #53 closed
Benjamin Jakimow created an issue

Bisheriges Verbinden mit processing framework signals:

#definition Signals
class Signals(object):

    class QObjectBinder(QObject):
        imageCreated = pyqtSignal(str)
        pickleCreated = pyqtSignal(str)
        htmlCreated = pyqtSignal(str)
    signals = QObjectBinder()

# registration slots
from enmapboxplugin.processing.Signals import Signals
Signals.signals.imageCreated.connect(self.onFileCreated)
Signals.signals.pickleCreated.connect(self.onPickleCreated)
Signals.signals.htmlCreated.connect(self.onHtmlCreated)

Wenn class Signals von QObject ableitet kann auf QObjectbinder verzichtet und der Aufruf verschlankt werden. Intuitiv würde ich eh davon ausgehen, dass eine Klasse "Signals" eben jene auch direkt nach aussen darstellt und keine Extraklasse benötigt.

#definition Signals
class Signals(QObject):
    imageCreated = pyqtSignal(str)
    pickleCreated = pyqtSignal(str)
    htmlCreated = pyqtSignal(str)


# registration slots
from enmapboxplugin.processing.Signals import Signals
Signals.imageCreated.connect(self.onFileCreated)
Signals.pickleCreated.connect(self.onPickleCreated)
Signals.htmlCreated.connect(self.onHtmlCreated)

Comments (6)

  1. Andreas Janz

    Ist wieder so eine Design-Entscheidung (aka Geschmackssache). Ich kapsele alle connect/disconnect/emit Funktionalitäten der Signale in einer Klasse und biete jeweils Methoden an. Lass dazu mal skypen/quatschen.

  2. Andreas Janz

    Nachtrag: hast du das mal ausprobiert, ob das so läuft. So wie ich das verstanden habe, musst du bei deiner Version eine Instanz Signals() erzeugen. Der direkte Zugriff auf die ClassMember Signal.imageCreated führt zu einer Fehlermeldung.

    In meiner Version kann man natürlich noch die Member der Internen Klasse in Signals verfügbar machen, dann muss man nicht über Signals.signals.htmlCreated gehen, sondern kann direkt Signals.htmlCreated benutzen

  3. Benjamin Jakimow reporter

    Stimmt, die pyqtSignals müssen instanziiert werden. Wenn Signals ein Singleton sein soll, dann geht das z.B. so:

    from PyQt4.QtCore import *
    
    class Signals(QObject):
        sigImageCreated = pyqtSignal(str)
        sigPickleCreated = pyqtSignal(str)
        sigHtmlCreated = pyqtSignal(str)
    
    Signals = Signals()
    
    def onSignalReceived(result):
        print(('Signal received:',result))
    
    if __name__ == '__main__':
        qApp = QCoreApplication([])
        #add site-packages to sys.path as done by enmapboxplugin.py
        Signals.sigImageCreated.connect(onSignalReceived)
    
        #test
        Signals.sigImageCreated.emit('path to image')
        Signals.sigPickleCreated.emit('non received signal')
        qApp.exec_()
    
  4. Log in to comment