2016-10-22 1 views
-1

У меня есть QtApp & чистая библиотека C++. Библиотека C++ предоставляет один простой класс под названием MyCppLibApiClass. Класс QtApp имеет класс, который встроен в main.qml. Ниже класс:Как установить чистый экземпляр объекта C++ в QQuickItem

class MyQuickItem : public QQuickItem { 
    MyQuickItem(); 
} 

После qml код для quick item:

import MyQuickItem 1.0 

MyQuickItem { 
    id: myQuickItemID 
    visible: true 
    objectName: "myQuickItem" 
} 

Ниже приводится мой main.cpp показывая я загружаю qml деталь:

qmlRegisterType<MyQuickItem>("MyQuickItem", 1, 0, "MyQuickItem"); 
QQmlApplicationEngine engine; 
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); 
return app.exec(); 

MyQuickItem необходим доступ к MyCppLibApiClass пример. Как я могу получить действительный экземпляр до MyQuickItem в main.cpp? Мне нужно установить объект MyCppLibApiClass в качестве участника в MyQuickItem. Я могу сделать это, используя метод setter. Но, прежде всего, мне нужно получить действительный экземпляр до MyQuickItem. Итак Как добраться до MyQuickItem в main.cpp?

Я искал достаточно, прежде чем задавать этот вопрос. Я прочитал это link. Кроме того, This вопрос, отправленный мной, не дал мне точного ответа. Следовательно, перефразируя мой вопрос более четко, чтобы попытаться получить ответ. Цените предложения этого ..

+0

Чтобы выставить свой класс в QML, вы должны получить его из t наименьший QObject (или из QQuickItem, если это видимый элемент). В другом случае вы можете обернуть его в QObject и, таким образом, подвергнуть его QML, используя 'qmlRegisterType' – folibis

+0

, как вы видите в моем вопросе, я уже вывел' MyQuickItem' из 'QQuickItem'. Теперь, как мне получить доступ к экземпляру 'MyQuickItem' в' main.cpp'? –

+0

Что это значит? если вы выставляете свой класс QML с помощью 'qmlRegisterType', вы не должны его вводить. Он будет представлен QML. – folibis

ответ

2

Если у вас есть один экземпляр вашего объекта библиотеки, есть два способа, вы можете это сделать в зависимости от того, какого доступа вам нужно:

  • имеет экземпляр как статический член класса MyQuickItem, инициализируйте его в main.cpp перед созданием приложения QML, после чего вы можете получить доступ к нему изнутри MyQuickItem в C++.

  • имеют экземпляр inherit QObject и раскрывают его как свойство контекста, таким образом его можно получить из QML.

Если это не единичный объект, у вас есть два направления действий:

  • создать объект QML от C++, это даст вам прямой указатель на него
  • найти объект QML в дереве объектов с использованием QQmlApplicationEngine::rootObjects().at(0).findChild() для имени типа и объекта, если найден у вас будет указатель на объект

Однако, как один из ответов на вопросы, у вас есть Li ked предлагает, это на самом деле не считается рекомендуемой практикой. Вероятно, это лучший способ сделать это, вы не должны устанавливать параметры объекта QML в main.cpp, это должно быть либо в конструкторе, либо в публичном интерфейсе MyQuickItem.

+0

Спасибо за ваше внимание на этом. Могу ли я открыть 'setproperty' в' MyQuickItem', который принимает чистый класс C++? Можете ли вы предоставить некоторые справочные проекты по github или где-то делать то же самое? –

+1

Вы можете передавать непрозрачные не связанные с QObject типы C++ в QML в качестве параметров и возвращаемых значений, если вы 'Q_DECLARE_METATYPE (YourType)' То есть, если вам нужно сделать это из QML, из C++ у вас есть полный доступ к общему интерфейсу объекта, вы можете сделать, как вам будет угодно. Но опять же, вы делаете это неправильно **. Теперь это может не иметь значения, но рано или поздно это произойдет. Плохой дизайн всегда ужасен в долгосрочной перспективе. – dtech

+0

Что вы рекомендуете, лучший способ сделать это? У меня есть «чистая библиотека C++», представляющая чистый класс cpp с api. Я не могу позволить себе добавить qt в библиотеку cpp. Все, что мне нужно, это установить этот класс библиотеки cpp в класс быстрого элемента qml. Есть ли примеры кода на github, на которые я могу ссылаться? это будет здорово, если может предоставить некоторые образцы кода PLS –

2

в вашем основном.каст:

qmlRegisterType<MyQuickItem>("MyQuickItem", 1, 0, "MyQuickItem"); 
QQmlApplicationEngine engine; 
MyQuickItem myItem; 
engine.rootContext()->setContextProperty("myItem", &myItem); 
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); 

Теперь вы можете получить доступ к myItem из C++ и доступ к тому же myItem из QML, просто установив свойство «myItem» на уровне корневого контекста QML быть ссылкой на ваш пользовательский объект.

EDIT

Я добавил объявление qmlRegisterType к ответу.

По желанию в комментарии:

< Использование qmlRegisterType>() используется для регистрации определенного типа в QML, которые затем могут быть созданы/доступ из QML.

Используя engine.rootContext()->setContextProperty("myItem", &myItem) метод вы фактически создаете myItem в C++ и настройка собственности myItem на C++

Поскольку QML предназначен для работы с C++, то можно просто присвоить myItem как свойство в QML и поскольку QML автоматически наследует свойства/объекты от родительских объектов, то myItem становится доступным во всем контексте QML.

Ни один из этих двух примеров, были испытаны, и просто, чтобы продемонстрировать эту идею

Пример main.qml

import MyQuickItem 1.0 

Item { 
    Component.onCompleted { 
     myItem.visible = true; 
     myItem.myCustomMethod(); 
    } 
} 

Пример класса C++

class MyQuickItem : public QQuickItem { 


    MyQuickItem(); 

public slots: 
    void myCustomMethod() { /* do some C++ stuff here */ } 

} 
+1

мой ответ был действительно только ответом ddriver, который был написан только в коде, поэтому лучше понять его ответ на вопрос о ddriver выше – mike510a

+0

спасибо за код. Я вижу, что вы не делаете 'qmlRegisterType (« MyQuickItem », 1, 0,« MyQuickItem »)'. Если я этого не сделаю, то Qt не позволяет мне «импортировать MyQuickItem 1.0». следовательно, запрещает мне вообще объявлять 'MyQuickItem' в' main.qml'. 'qmlRegisterType' больше не требуется? Не могли бы вы предоставить часть 'qml' кода вокруг' MyQuickItem'? –