import sys

try:
    from PySide6.QtCore import QObject, Signal, Slot, QThread, QTimer, qVersion, QCoreApplication
except ImportError:
    from PySide2.QtCore import QObject, Signal, Slot, QThread, QTimer, qVersion, QCoreApplication


class ThreadPrinter(QObject):

    def __init__(self):
        super().__init__()
        # 'sig' is assigned outside of __init__
        self.sig.connect(lambda: print('Never called.'))

    def undecorated_print_thread(self):
        t = QThread.currentThread()
        print(f'\nThreadPrinter.undecorated_print_thread(): Current: {t}')

    @Slot()
    def decorated_print_thread(self):
        t = QThread.currentThread()
        print(f'\nThreadPrinter.decorated_print_thread(): Current: {t}')


class Signaller(QObject):
    sig_undecorated = Signal()
    sig_decorated = Signal()

    def __init__(self):
        QObject.__init__(self)
        self.thread = QThread()
        self.thread.setObjectName("testThread")
        self.thread_printer = ThreadPrinter()        
        self.thread_printer.moveToThread(self.thread)
        self.thread.start()
        print(f"\nmoved ThreadPrinter to {self.thread}")

        self.sig_decorated.connect(self.thread_printer.decorated_print_thread)
        self.sig_undecorated.connect(self.thread_printer.undecorated_print_thread)

    def run(self):
        t = QCoreApplication.instance().thread()
        print(f'\nMain thread: {t}')
        # Trigger ThreadPrinter.decorated_print_thread
        print("sig_decorated.emit()")
        self.sig_decorated.emit()

        # Trigger ThreadPrinter.undecorated_print_thread
        print("sig_undecorated.emit()")
        self.sig_undecorated.emit()

        self.thread.quit()
        self.thread.wait()

    @Slot()
    def stop(self):
        self.thread.quit()
        self.thread.wait()
        app.quit()



if __name__ == '__main__':
    print('Python {}.{}.{}'.format(sys.version_info[0], sys.version_info[1],
                                   sys.version_info[2]))
    print(qVersion(), "\n")
    app = QCoreApplication()
    ThreadPrinter.sig = Signal()
    signaller = Signaller()
    QTimer.singleShot(10, signaller.run)
    QTimer.singleShot(2000, signaller.stop)
    app.exec_()
