Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt5 | Множественное наследование и __new__ [RSS Feed]

#1 Фев. 24, 2017 14:34:56

aiscy
Зарегистрирован: 2015-06-17
Сообщения: 52
Репутация: +  9  -
Профиль   Отправить e-mail  

PyQt5 | Множественное наследование и __new__

Всем привет.
Делаю небольшую прогу на 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
Но в результате вместо виджета получаю ошибку: “object.__new__(XML) is not safe, use QTreeView.__new__()”
Подскажите, пожалуйста, где я ошибся.

Отредактировано aiscy (Фев. 24, 2017 16:15:23)

Офлайн

  • Начало
  • » GUI
  • » PyQt5 | Множественное наследование и __new__[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version