Seite 1 von 1

Event weitergeben

Verfasst: Montag 30. Dezember 2019, 10:42
von superschlau
Salü zäme
Ich versuche ein Event (Modul events) aus eine Klasse in die aufrufende Klasse weiterzugeben.
Aufrufende Klasse Qt5-Klasse mit Oberfläche, aus der Bearbeitungsklasse (Berechnung) möchte ich den Stand der Berechnung zur Darstellung an einer Progress Bar zurückgeben.
Kann mir jemand sagen, wie ich sowas hinkriegen kann.

Danke und Gruss, Jakob

Re: Event weitergeben

Verfasst: Montag 30. Dezember 2019, 10:56
von __deets__
Ohne Code sehr abstrakt was du da beschreibst. Wenn ich raten muss: das klingt nach dem signal slot Mechanismus von Qt der genau für sowas geschaffen ist.

Re: Event weitergeben

Verfasst: Montag 30. Dezember 2019, 12:39
von superschlau
Habe es selber rausgefunden:

Code: Alles auswählen

from events import Events
import threading

class klasse21:
    
    def __init__(self):
        kl2 = klasse22()
        kl2.events.on_Change += self.printEvent
        kl2.getValues()
        
    def printEvent(self, value):
        print(value)
        
        
class klasse22:
    
    def __init__(self):
        self.events = Events()
        self.value = 0
        
    def getValues(self):
        threading.Timer(1.0, self.getValues).start()
        self.value += 1
        self.events.on_Change(self.value)
      
    
kl1 = klasse21()
Hier ein kleines Beispiel. Die erste Klasse baut ein Event in die zweite Klasse. Wird ein Wert diesem Event eingetragen

Code: Alles auswählen

 self.events.on_Change(self.value)
löste dies ein Trigger in der ersten Klasse aus, die Prozedure "printEvent" wird aufgerufen...

Re: Event weitergeben

Verfasst: Montag 30. Dezember 2019, 13:17
von __deets__
Ach das Modul kannte ich gar nicht. Ich bleibe aber bei meinem Vorschlag und würde dir auch mit Nachdruck dazu raten. Denn du arbeitet mit threads und ich wette du willst GUI Elemente Updaten. Und das wird mit den Events in die Hose gehen. Signal Slot hingegen übermittelt die Events von einem in den anderen thread wenn man es richtig(!) macht.

Re: Event weitergeben

Verfasst: Dienstag 31. Dezember 2019, 14:08
von superschlau
Das verstehe ich nun nicht ganz und weiss nicht recht, ob dein Vorschlag wirklich mein Problem löst.
So viel ich bis jetzt weiss, wird ein Slot aus der Bearbeitungsschicht von Qt5, das wäre in meinem Beispiel zum Beispiel die klasse21, bedient.
Wenn ich damit recht habe, so würde zum Beispiel aus meinem Beispiel in der Definition "printEvent" die Prozessbar bedient, indem der Wert "value" an dieses Objekt übergeben wird.
Wie aber kommt der Wert "value" aus der klasse22, in der Definition "getValue" simuliert zu dieser Definition "printEvent" der klasse21?
Ich versteh nicht ganz, wie du hier einen Signal-Slot bedienen willst.

deets, kannst du mir dies bitte erklären?

Re: Event weitergeben

Verfasst: Dienstag 31. Dezember 2019, 14:14
von __deets__
Signal und Slot sind die Qt Begriffe für das exact gleiche Muster (Observables) wie das von dir selbst eingesetzte Events. Statt += benutzt man connect. Statt on_change emit. Aber das war es. Was daran ist unklar?

Da du wirklich unfassbar schlechte Namen für dein Problem gewählt hast, die ich mir beim besten Willen nicht merken kann, hier mal ein Link auf ein Beispiel das zeigt, wie man mit Threads und Signal Slots umgeht: viewtopic.php?t=44250&start=15

Re: Event weitergeben

Verfasst: Dienstag 31. Dezember 2019, 14:22
von __deets__
Ein Nachtrag: weil du deine Threads nur für timing Aufgaben einsetzt: das ist so sehr ungeschickt, weil es immer wieder neue threads erzeugt. Das macht man nicht. Allgemein nicht, da würde man dann einfach einen Thread schlafen lassen, statt den zu beenden und einen neuen zu erzeugen. Und im speziellen würde man eh nur QTimer verwenden. Damit erreicht man bei kurzen Aufgaben das ganze ohne threads machen zu können, und erspart sich die ganzen Rödeleien die man mit threads hat.

Re: Event weitergeben

Verfasst: Dienstag 31. Dezember 2019, 15:45
von superschlau
deets, danke für dein Beispiel. Ja sehe jetzt wie du es meinst.
Einzig, was mich bei deiner Lösung etwas stört ist die Tatsache, dass ich diese Qt-Elemente (QObject) an meine Berechnungsklasse weitergeben werden müssen. Dadurch wirkt diese Lösung meiner Meinung nach nicht mehr universell. Gebe aber zu, auch bei meiner Lösung bekomme ich eine Abhängigkeit....

Deinem Hinweis zu meinem "Timing"- Thread stimme ich mit dir völlig überein. Dieser Teil kommt in meinem Code nicht vor und diente lediglich für das Modell.
Danke dir!

Re: Event weitergeben

Verfasst: Dienstag 31. Dezember 2019, 16:12
von __deets__
QObject vermeiden zu wollen klingt etwas sehr nach YAGNI. Aber machbar ist das natürlich trotzdem, niemand hindert dich, den generischen Code so schreiben, dass er nur native Möglichkeiten nutzt. Dazu muss er natürlich dann wieder in Qt-Land eingebürgert werden, und in einem eigenen Modul leben, damit er installiert werden kann ohne Qt, etc pp. Diesen Aufriss würde ich mir nur machen, wenn es wirklich klar ist, dass der wiederverwendet wird. Und selbst dann ggf erst, wenn das wirklich soweit ist. Denn nur dann kennt man die Anforderungen der anderen Anwendung wirklich.