2011-07-21 5 views
2

Я создаю приложение, в котором я хотел бы вызвать функцию из QML в источнике C++, и что функция C++ возвращает мне и объект, который я могу использовать с теми же свойствами в javascript-части QML. Я сделал связь и все такое. Я попытался отправить QVariantMap и попытался использовать этот объект в javascript, но я не получаю свойства этого объектаПолучить объект C++ в QML и использовать его в javascript

+0

Итак, на этом этапе QML распознает объекты C++, правильно? Создавали ли вы функции чтения и записи для элементов, к которым вы хотите получить доступ? – kmdent

+0

У меня есть что-то подобное, этот метод C++ возвращает qvariant map 'QVariantMap Mediator :: initialize() { table; Посредник m; Узел TestNode («1», таблица); QVariant test = QVariant :: fromValue (TestNode); Карта QVariantMap; map.insert ("1", proba); карта возврата; } ' , а затем в яваскрипте источника у меня есть: ' функция Foo (anObject) { console.log (anObject.getId()); } ' Так что я хочу вызвать методы из этого объекта. Пока я пытаюсь получить доступ к карте, он печатает только «QVariant (Node)» Извините за неформатированный текст – nikolakoco

+0

Вы уверены, что объект верен правильно? Я лично не видел никаких образцов с функциями, возвращающими экземпляры объектов (я мог ошибаться). Также я считаю, что любые объекты, подверженные qml, должны наследовать от QDeclarativeItem и регистрироваться с помощью qml ... Наконец, если все работает нормально, и вы получите правильный экземпляр, я бы ожидал получить идентификатор объекта с помощью свойства id: anObject.id (а не базовая функция getter) – George

ответ

0

Чтобы передать объект из C++ в QML в качестве возвращаемого значения функции, тип возвращаемого значения должен быть QVariant, а не QVariantMap, хотя это тип кода C++. Так что просто изменить initialize функцию подписи

QVariant initialize(); 

, не меняя ничего другого, а затем вы можете получить доступ к свойствам.

Что касается вашего более позднего комментария о необходимости вызова методов на этом возвращенном объекте, это невозможно; возвращаемый объект - это всего лишь набор пар имя-значение. Если вы хотите, чтобы объект имел, скажем, свойство id, вам нужно указать insert значение с этим ключом на QVariantMap в C++, прежде чем возвращать его.

1

Ваши классы, подлежащие экспонированию, должны наследовать от QObject (или QDeclarativeItem, если они являются компонентами пользовательского интерфейса), и вам придется регистрировать свои типы в своем main() или в плагине Qt перед загрузкой QML-кода.

Посмотрите http://developer.qt.nokia.com/doc/qt-4.7/declarative-tutorials-extending-chapter1-basics.html

3

Есть два способа экспорта типов на основе QObject из C++ в QML:

  1. Вернуться автономным QObject непосредственно из свойств считывателя или Q_INVOKABLE функции. Примечание. Объект, возвращаемый как свойство, имеет собственность C++, Q_INVOKABLE-объект имеет право собственности JS. Вы можете изменить это поведение по умолчанию с помощью http://doc.qt.nokia.com/4.7/qdeclarativeengine.html#setObjectOwnership.
  2. Возвращает массив QObjects. В этом случае вы должны использовать QObjectList, QDeclarativePropertyMap (не QVariantMap) или QAbstractListModel.

 Смежные вопросы

  • Нет связанных вопросов^_^