PyQt: Verbindet ein signal an einen slot zum starten einer hintergrund-Betrieb

Ich habe den folgenden code ausführt, hintergrund Betrieb (scan_value) beim Update der Fortschrittsbalken in der Benutzeroberfläche (progress). scan_value durchläuft einen gewissen Wert obj, das ein signal ausstrahlt (value_changed) jedes mal, wenn der Wert geändert wird. Aus Gründen, die hier nicht relevant, ich muss wickeln Sie diese in ein Objekt (Scanner) in einem anderen thread. Der Scanner wird aufgerufen, wenn Sie die a-Taste scan ist clicked. Und hier kommt meine Frage ... der folgende code funktioniert einwandfrei (d.h. die Fortschrittsanzeige aktualisiert wird).

# I am copying only the relevant code here.

def update_progress_bar(new, old):
    fraction = (new - start) / (stop - start)
    progress.setValue(fraction * 100)

obj.value_changed.connect(update_progress_bar)

class Scanner(QObject):

    def scan(self):
        scan_value(start, stop, step)
        progress.setValue(100)

thread = QThread()
scanner = Scanner()
scanner.moveToThread(thread)
thread.start()

scan.clicked.connect(scanner.scan)

Aber wenn ich den letzten Teil:

thread = QThread()
scanner = Scanner()
scan.clicked.connect(scanner.scan) # This was at the end!
scanner.moveToThread(thread)
thread.start()

Die Fortschrittsanzeige aktualisiert wird nur am Ende (meine Vermutung ist, dass alles auf dem gleichen thread). Sollte es irrelevant sein, wenn ich schließen Sie das signal an einen slot vor oder nach dem Umzug das Objekt erhalten Objekt auf den Thread.

Sieht aus wie ekhumoro richtig ist (pyqt/qt nicht angezeigt werden, automatische Erkennung der Anschlussart korrekt, sofern Sie nicht ausdrücklich dekorieren Sie Ihre slots mit @pyqtSlot()). Aber ich wollte darauf hinweisen, dass die Linie progress.setValue(100) thread unsichere, weil Sie Zugriff auf eine Qt-GUI-Objekt aus einem anderen thread als dem Hauptthread. Der rest deines geposteten code threadsicher ist in Bezug auf die Qt-GUI-Operationen
Es wäre interessant zu wissen, ob es eine PyQt Fehler hier, oder wenn es ist gerade eine Besonderheit, wie PyQt Verbindung zu Python callables. Ich weiß, dass irgendeine Art von proxy-Objekt wird erstellt, wenn @pyqtSlot nicht verwendet, aber genau das, was Konsequenzen hat für die verbindungen in der Warteschlange, weiß ich nicht.
Ich denke, es könnte eine PyQt4-bug, oder zumindest ein Mangel, der korrigiert werden sollte. Es ist sicherlich nicht zeigen das gleiche Verhalten in PySide (PySide läuft immer die scan Funktion in der QThread-unabhängig davon, wo das signal war conected oder wie der slot ist eingerichtet). Ich habe eine minimilistic Beispiel hier pastebin.com/SqP3WM1z , Drucke, von welchem thread die Dinge laufen werden.
Danke für den test-Fall. Ich glaube, ich habe festgestellt, warum das problem Auftritt (siehe meine aktualisierte Antwort). Angesichts der Art und Weise PyQt funktioniert derzeit, ich glaube, ich würde jetzt sagen, dass es ist ein Mangel und nicht ein bug. Nicht sicher, ob es möglich wäre, es zu korrigieren, aber.

InformationsquelleAutor Hernan | 2013-12-23

Schreibe einen Kommentar