# !/usr/bin/python3.8
# -*- coding: utf-8 -*-
import sys
import typing

from PySide2.QtCore import QObject
from PySide2.QtWidgets import QApplication, QCheckBox, QGridLayout, QLabel, QWidget


class MainWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.setLayout(QGridLayout())

        self.label = QLabel('test')
        self.checkbox = QCheckBox('check')
        self.checkbox.clicked.connect(self.connect_checkbox)

        self.layout().addWidget(self.label)
        self.layout().addWidget(self.checkbox)

    def connect_checkbox(self):
        print('connect_checkbox')


def record():
    print('record')


def main():
    app = QApplication(sys.argv + ["--no-sandbox"])
    window = MainWindow()
    window.show()

    for widget in app.allWidgets():
        meta_object = widget.metaObject()
        name = f'{widget.__module__}.{meta_object.className()}'

        for i in range(meta_object.propertyCount()):
            property = meta_object.property(i)
            if not property.hasNotifySignal():
                continue

            signal = property.notifySignal()
            print(name, signal.name(), type(signal.name()), signal.methodSignature(), type(signal.methodSignature()))

            print(
                isinstance(widget, QObject),
                isinstance(signal.methodSignature().data(), bytes),
                isinstance(record, typing.Callable)
            )

            widget.connect(widget, signal.methodSignature().data(), record)

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
