Kalombyr
@Kalombyr

Как работать в QML через интерфейс класса?

Добрый день.
Есть большая необходимость передать в QML интерфейс класса и там через него работать, в основном вызывать слоты.
Дело в том, что интерфейс обязательно не должен наследоваться от QObject, иметь макрсо Q_OBJECT/Q_GADGET.
Не обязательно иметь "чистый" интерфейс, т.к. понимаю, что без каких-либо уступков сделать так как хочется не получиться, т.к. уже пробовал Q_DECLARE_METATYPE и прочее - не хочет.
Подскажите, пожалуйста, как правильно?
IInterface  * f = new MyClass(0);
rootObj.setProperty("classInterface", QVariantFromValue(f));


....
property var classInterface: null;
....
onClick: {
   console.log( classInterface.publicSlotTestFunction()  );
}
...
  • Вопрос задан
  • 375 просмотров
Решения вопроса 1
PavelK
@PavelK
Вообще чисто теоретически это возможно, но с ограничениями из-за принципа метасистемы Qt, а именно она регистрирует каждый тип под своим номером, а потом, когда нужно, на основе этого номера создаёт сам экземпляр класса.
То есть можно подменить, что бы при создании интерфейса создавать вместо него сам класс, но тогда вы не сможете использовать интерфейс "в прямом" его понимании, т.е. использовать множественное наследование, т.е. один класс, один его интерфейс всё. Хотя может быть да же и это можно обойти, если хорошо покопаться в метасистеме т.к. я внутренности смотрел не слишком пристально, но то, что возможно, это точно.

UPDT1: Пардон, всё уже придумано до нас: pavelk.ru/ispolzovanie-interfejsov-klassov-v-qt-i-qml
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@tschin
qmlRegisterType("my.class",1,0,"Class") возможно вам поможет, но если вы хотите, чтобы свойства класса были видны из qml, без наследования QObject вам вроде не обойтись.
Еще, помимо Q_DECLARE_METATYPE, надо делать qRegisterMetaType
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы