import sys

from PySide6.QtCore import QCoreApplication, QEvent, QTimer, Slot
from PySide6.QtStateMachine import QAbstractTransition, QState, QStateMachine

class UserEventTransition(QAbstractTransition):
    def eventTest(self, event: QEvent) -> bool:
        return event.type() == QEvent.Type.User
    
    def onTransition(self, event: QEvent) -> None:
        pass

class App(QCoreApplication):
    def __init__(self):
        super().__init__()
        self.machine = QStateMachine(self)
        state = QState(self.machine)
        t = UserEventTransition()
        state.addTransition(t)
        t.triggered.connect(lambda: print("Triggered"))

        self.machine.setInitialState(state)
        self.machine.start()

        QTimer.singleShot(100, self.send_event_safe)
        QTimer.singleShot(200, self.send_event_unsafe)
        QTimer.singleShot(300, self.send_event_safe)
    
    @Slot()
    def send_event_safe(self):
        self.saved_ref = QEvent(QEvent.Type.User)
        print("Posting event (saving ref)")
        self.machine.postEvent(self.saved_ref)

    @Slot()
    def send_event_unsafe(self):
        print("Posting event (not saving ref)")
        self.machine.postEvent(QEvent(QEvent.Type.User))



if __name__ == "__main__":
    app = App()
    sys.exit(app.exec())
