olebole hat geschrieben:solarix hat geschrieben:Das sind keine Threads, sondern das ist (wie bereits erwähnt) indirekt rekursiv. Ist doch schön zu erkennen: 2 - 4 - 10 - 10 - 4 - 2
Ich glaube, dass es hier ein Mißverständnis gab: ich meine mit "asynchron", dass die Event
auslösung asynchron erfolgt, dass also ein neues Event bereits verarbeitet wird, während das alte noch nicht fertig verarbeitet ist.
Du meintest dagegen (oder?), dass die Event
verarbeitung synchron ist, dass also weitere Events, die im Zuge eines Events ausgelöst werden,
im gleichen Thread behandelt werden.
OK. Wenn du so davon überzeugt bist, dass es sich um Threads handelt, dann bitte block deine SLOTS mit ner QMutex. Wenn sich an dem Verhalten etwas ändert, weißt du dass es Threads sind, wenn nicht sind es keine Threads.
Geht nicht, da die QSlider intern eine Integer-Darstellung haben und dadurch Rundungsfehler auftreten.
Dann hast du ein Designproblem, wenn du Kontrollelemente mit verschiedenen Typen zulässt.
Hinzu kommt, dass bereits während der Verarbeitung eines Signals ein neues eintreffen kann. Daher kann es durchaus sein, dass der QSlider das setValue() des Control erst aufruft, nachdem diesen bereits einen neuen Wert erhalten hat und ihn dann wieder zurücksetzt. Daher ist dadurch im Vergleich zur blockSignals()-Lösung nichts gewonnen.
Dann hast du eine Programmierblockade

DU hast es in der Hand, dein GraphicsView zu koordinieren. DU hast die Connects in der Hand.
Ich würde dir als Design vorschlagen:
Gib doch deinem GV zwei SIGNALS:
scrolled(int x-val, int y-val);
zoomed(int val);
Jetzt connectest du jedes Control nur mit dem GV, und nicht die Controls auch noch untereinander.
Ein Control wird bedient. SLOT im GV wird aufgerufen. GV wird gezoomt/gescrollt. GV emittiert Signale entsprechend, alle Controls werden angepasst. Controls emittieren SIGNALs, werden aber abgewiesen, da die Werte denen des GV entsprechen. Da alles auf int basiert gibts auch keine Rundungsfehler...
Und um die ganze Sache noch abzurunden, packst du das ganze in ein eigenes Widget, damit du nicht bei jedem erstellen diesen ganzen HokusPokus betreiben musst. Dann ergibt sich eine vollkommen neue Option! Dein übergeordnetes Widget managed mit eigenen Signals/Slots die Connections, die GV und Controls sind nicht miteinander verbunden!
Tada, dann kannst du in einem eigenen SLOT die Slots der Controls und des GV direkt aufrufen (ohne connection), dann funktioniert ein bloskSignal vorher gar wunderbar.