2014-11-08 2 views
1

Я создаю плагин-систему для моего приложения QML + C++. Плагины - это QML-файлы. QML-файл может выглядеть следующим образом:Загрузить свойство из QML-файла в C++

Item { название: "Sexy Plugin" версии: "1,0" }

Как прочитать название и версию внутри C++?

ответ

1

Проще всего было бы написать QuickItem на C++. Даже когда его просто небольшой компонент, который просто имеет название и версию. Тогда он легко доступен в C++ и его самом чистом пути, чтобы разделить вид и логику. Затем вы можете просто определить свойства с помощью известного макроса Q_PROPERTY.

Если вы действительно хотите использовать только QML написанные компоненты, и не хотите, чтобы написать что-нибудь в C++, есть решение уже упоминались в этой странице: http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html

Цитирования соответствующей части от «Доступа к членам QML Object Type from C++ ":

QQmlEngine engine; 
QQmlComponent component(&engine, "MyItem.qml"); 
QObject *object = component.create(); 

qDebug() << "Property value:" << QQmlProperty::read(object, "someNumber").toInt(); 
QQmlProperty::write(object, "someNumber", 5000); 

qDebug() << "Property value:" << object->property("someNumber").toInt(); 
object->setProperty("someNumber", 100); 

Так что QQmlProperty может вам помочь.

Как я не знаю, какова ваша цель, я ничего не буду рекомендовать. В любом случае, на мой взгляд, первый способ просто написать элемент в C++ во многих случаях намного чище, чем пытаться получить свойства из Qml.

+0

при использовании функции "component.create()", создает ли новый экземпляр? Как насчет двух файлов C++, оба файла хотят получить доступ к уже созданному QObject. Как это реализовать? Благодаря! – user1914692

2

Каждый элемент QML наследует QObject прямо или косвенно, поэтому вы можете использовать метасистему для чтения и записи свойств «динамически».

QVariant QObject::property(const char * name) const 

Возвращает значение свойства имя объекта. Если такого свойства не существует, возвращаемый вариант недействителен.

Если элемент случается корневой элемент, вы можете использовать QQuickItem * QQuickView::rootObject() const, чтобы получить его, если нет, то вам придется установить objectName : QString свойства, Avaiable для каждого QObject производного объекта и вызвать findChild<QObject*>("name") от корневого объекта.

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