Ich arbeite an einer komplexen und schlecht kommentierte Qt-basierte Python-Anwendung. Es verwendet einen PySide.QtCore.QTimer.singleShot (int, slot) -Timer, um die Ausführung eines Slots innerhalb eines Threads zu verzögern, und ich bin verwirrt, wie dieser Timer funktioniert.Wie man eine PySide.QtCore.QTimer.singleShot ruft seine Timeout-Methode
Hier ist ein MWE. Dieses Beispiel verwendet den Ansatz, QThread abzuleiten und run() neu zu implementieren. Ich habe folgendes in einer Datei namens timertester.py:
import PySide
import time
class SubClassThread(PySide.QtCore.QThread):
def run(self):
print('called SubClassThread.run()')
self.delayed_print()
def delayed_print(self):
print('called SubClassThread.delayed_print()')
PySide.QtCore.QTimer.singleShot(1000, self.print_things)
time.sleep(2)
print('end of delayed_print()')
def print_things(self):
print('called print_things')
Der Code Ich verwende diese (es nennen test.py
) zu testen:
import sys
import time
import PySide
from timertester import SubClassThread
print('Test: QThread subclassing')
app = PySide.QtCore.QCoreApplication([])
sct = SubClassThread()
sct.finished.connect(app.exit)
sct.start()
sys.exit(app.exec_())
Der Ausgang des python test.py
:
Test: QThread subclassing
called SubClassThread.run()
called SubClassThread.delayed_print()
end of delayed_print()
Der kuriose Teil ist, dass die an QTimer.singleShot übergebene nie aufgerufen wird (es gibt keine called print_things()
in der Ausgabe!) Ich würde jede Klarheit sehr schätzen das kannst du dir verraten. Ich habe das Gefühl, dass mir eine einfache Zutat des Qt-Rahmens fehlt. Bitte ertragen Sie mich - ich habe einige Stunden damit verbracht, nach Antworten zu suchen.
Diese Antwort brachte mich auf den richtigen Weg, also gebe ich den Scheck. Ich werde dann meine eigene Antwort hinzufügen, damit die Leute den Code sehen können, der letztendlich den Trick gemacht hat. – lensonp