import sys
import PyQt6.sip as sip
from PyQt6.QtCore import QObject, qVersion, Qt
from PyQt6.QtWidgets import QApplication,QWidget,QMainWindow



# Avoid repr on QObject, which may crash
def format_obj(o):
    addr = hex(id(o))
    typeS = type(o).__qualname__
    return f" {typeS}/id={addr}"


if __name__ == '__main__':
    print('Python {}.{}'.format(sys.version_info[0], sys.version_info[1]))
    print("PyQt ", qVersion())
    do_show = "-s" in sys.argv

    app = QApplication([])
    win = QMainWindow()
    ptr = sip.unwrapinstance(win)

    print("\n", win, "\nwin=", format_obj(win))
    print(sip.dump(win))

    print("\nthis gives different objects but the same address:")
    wrapO = sip.wrapinstance(ptr, QObject)
    wrapM = sip.wrapinstance(ptr, QMainWindow)
    print("wrapped as QObject       : ", format_obj(wrapO))
    print(sip.dump(wrapO))
    print("\nwrapped as QMainWindow   : ", format_obj(wrapM))
    print(sip.dump(wrapM))

    print("\nIf I assign the objects, they become different:")
    wrapO2 = sip.wrapinstance(ptr, QObject)
    print("wrapped as QObject, 2    : ", format_obj(wrapO2))
    print(sip.dump(wrapO2))
    wrapM2 = sip.wrapinstance(ptr, QMainWindow)
    print("\nwrapped as QMainWindow, 2: ", format_obj(wrapM2))
    print(sip.dump(wrapM2))
    if do_show:
        wrapM2.show()
        sys.exit(app.exec())


