Note that there are some explanatory texts on larger screens.

plurals
  1. POPython decorator to aggregate PyQt signals
    primarykey
    data
    text
    <p>I often have many signals that would ideally be processed all at once. For example, the signal that triggers an update to an OpenGL window can be aggregated into a single signal. Another example is the signal that dirties a row in a table.</p> <p>Ideally, I'd like the decorator to generate code something like what's below (between START and END):</p> <pre><code>#!/usr/bin/env python from PyQt4.QtCore import * from PyQt4.QtGui import * from functools import wraps import signal import sys signal.signal(signal.SIGINT, signal.SIG_DFL) class AggregateManager: def __init__(self): self.clear() def clear(self): self.sent = False self.value = 0 def aggregate(self, other): send = not self.sent self.sent = True self.value += other return send class A(QObject): def __init__(self): super().__init__() # START self.generated_signal.connect(self.slot, Qt.QueuedConnection) self.slot_manager = AggregateManager() @pyqtSlot(int) def decorated_slot(self, *args): me = self.slot_manager if me.aggregate(*args): print("Sending") self.generated_signal.emit() generated_signal = pyqtSignal() @pyqtSlot() def slot(self): me = self.slot_manager print("Received", me.value) me.clear() # END class B(QObject): signal = pyqtSignal(int) a = A() b = B() b.signal.connect(a.decorated_slot) for i in range(10): b.signal.emit(i) app = QApplication(sys.argv) sys.exit(app.exec_()) </code></pre> <p>This way, a single call to <code>slot</code> is made for many signals sent to decorated_slot. How do I use Python decorators to replace everything between START and END?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload