Die Lösung für das Problem ist doch trivial. Du musst mit der Deklaration des Signals eben warten, bis die Klasse erzeugt ist:
Code: Alles auswählen
class ModelFiller(QThread):
# …
ModelFiller.progress = pyqtSignal(ModelFillter)
Falls Du damit einfach nur das Sender-Exemplar an den Slot durchreichen möchtest, ist das allerdings unnötig. In von QObject abgeleiteten Klassen kannst Du im Slot einfach "self.sender()" aufrufen, um den Auslöser des Signals zu erhalten. Alternativ kannst Du partielle Funktionen verwenden:
Code: Alles auswählen
filler.progress.connect(functools.partial(bar.progress_slot, filler)))
Das ist der schönere Ansatz, denn er nutzt die Möglichkeiten von Python und vermeidet, dass man immer explizit "self" beim Auslösen des Signals übergeben muss.
Ohne die spezielle Situation zu kennen, würde ich allerdings pauschal sagen, dass so ein "Durchgriff" an den Sender ein Design Smell sein könnte, und vielleicht auf ungenügende Kapselung der Komponenten schließen lässt. Im Idealfall sollte dem Empfänger der Sender vollkommen unbekannt und egal sein.
PS: Dem Namen nach geht es darum, ein Modell asynchron zu befüllen. Das ist eine Situation, in der C++ tatsächlich von Vorteil sein könnte, da man solche asynchronen Aufgaben mit QtConcurrent mitunter sehr elegant ausdrücken kann. QtConcurrent ist unter Python allerdings nicht verfügbar ...