Делаю небольшую прогу на PyQt5, так она выглядит на текущий момент:
Застрял на этапе создания виджетов для вкладок QTabWidget.
Если вручную указать, что для открытия файлов формата xml используется класс XML, то все работает нормально, но интересно реализовать класс, который самостоятельно выбирает нужный класс-наследник, исходя из расширения файла.
Сам класс:
class WidgetHandler: def __new__(cls, path, parent=None): ext = os.path.splitext(path)[1].replace('.', '') for subclass in cls.__subclasses__(): if subclass.__name__.lower() == ext: return super().__new__(subclass) raise NotImplementedError def __init__(self, parent, path): self._path = path self._parent = parent self._is_modified = False # Флаг для проверки был ли изменен файл self._create() def _create(self): raise NotImplementedError def _save(self): raise NotImplementedError def _close(self): raise NotImplementedError def save(self) -> None: if self._is_modified: self._save() self._is_modified = False def close(self) -> None: if self._is_modified: pass # TODO Запрос сохранения self._close()
Его наследник:
class XML(WidgetHandler, QTreeView): def _create(self): self.setParent(self._parent) model = DomModel(self._path) # model.dataChanged.connect(lambda: print('Data Changed')) self.setModel(model) self.expandAll() self.setRootIsDecorated(False) self.setItemsExpandable(False) delegate = XMLDelegate() self.setItemDelegate(delegate) def _save(self): pass def _close(self): pass
Подскажите, пожалуйста, где я ошибся.