"""Illustration of the problem with a subclass of QUiLoader. Returning
my_widget_inst causes a segmentation fault but returning orig_widget_inst
does not."""

import sys
from importlib import import_module

from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication
import shiboken2

class MyLoader(QUiLoader):
    def __init__(self):
        super().__init__()
        self.widget_mod = import_module("PySide2.QtWidgets")

    def createWidget(self, class_name, parent=None, name=''):
        orig_widget_inst = QUiLoader.createWidget(self, class_name, parent=None, name='')
        print("orig_widget_inst =", orig_widget_inst)
        print(shiboken2.isValid(orig_widget_inst))
        print(shiboken2.dump(orig_widget_inst))

        widget_class = getattr(self.widget_mod, class_name)
        my_widget_inst = widget_class(parent)
        print("my_widget_inst =", my_widget_inst)
        print(shiboken2.isValid(orig_widget_inst))
        print(shiboken2.dump(my_widget_inst))

        #return orig_widget_inst
        return my_widget_inst

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ui_file = QFile(sys.argv[1])
    ui_file.open(QFile.ReadOnly)
    loader = MyLoader()
    loader.load(ui_file)
    ui_file.close()

