import sys

from PySide6.QtCore import QLibraryInfo, QObject, qVersion, Qt
from PySide6.QtWidgets import QApplication,QWidget,QMainWindow
from shiboken6 import Shiboken


# 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(QLibraryInfo.build())
    do_show = "-s" in sys.argv

    app = QApplication([])
    win = QMainWindow()
    ptr = Shiboken.getCppPointer(win)[0]

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

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

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


