2016-09-08 2 views
1

Im пытается разработать игру, но не только связан с игрой, но и чем угодно. Мой вопрос: Как вы создаете/удаляете/управляете объектами на C++, и они появляются/исчезают/меняются в qml?Qt создать объект в C++ и выставить QML

Я знаю, что многие пользователи говорят мне читать

http://doc.qt.io/qt-4.8/qtbinding.html

http://doc.qt.io/qt-5/qtqml-cppintegration-contextproperties.html

http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html

http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html

и так далее ...

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

Давайте поставим простой код, например

class Unit { 

int posX, posY; 
int energy; 

void move()... 
void create()... 
void kill() 
} 

Тогда мы будем реализовывать всю логику в C++ внутри основного и всех необходимых subclases.

Game.cpp 
class Game { 
QList<Unit> listUnits; 

moveUnits() { 
for (int i = 0; i < units.size(); i++){ 
Unit unit; 
unit.move(); 
} 

createNewUnit(){ 
Unit unit = new Unit(); 
listUnits.append(unit); 
} 
} 

On the other side will have Unit.qml 

Item{ 
property int posX; 
property int posY; 
Animation on X {...} 
....  
} 

что в основном для обработки пользовательского интерфейса, связанный с блоком, но я повторяю, вся логика будет сделано еще раз в C++.

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

Как это сделать? Im действительно уверен, что можно сделать, и я уверен, что это довольно просто, я просто не узнал. Мне не нужен код, просто подсказка, ссылка или учебник.

В случае, если решение действительно находится на одном из писем, которые я написал ранее, я прошу вас объяснить это более подробно, потому что я до сих пор не узнал.

Большое спасибо!

ответ

4

Вот как подключить C++ для QML

  • Сделайте ваш C++ класс наследует от QObject (то есть он должен также иметь Q_OBJECT макрос выше public:
  • Добавьте Q_INVOKABLE макрос перед некоторыми ваших общественных методов, чтобы их можно было вызывать из QML. Например, Q_INVOKABLE int doStuff(int myParam);

  • В главном файле зарегистрируйте класс, чтобы QML мог его найти: qmlRegisterType<Foo>("MyFoo", 1, 0, "Foo");

  • Импорт класса C++ в файле QML import MyFoo 1.0 (обратите внимание, что 1,0, потому что в qmlRegisterType, я передал параметры 1 и 0)
  • Теперь Вы можете добавить свой класс C++ в QML файл. Foo { id: foo} и может вызывать ваши методы из других источников в QML, например.

    функция qmlDoSomething (значение) { вар newInt = foo.doStuff (вал) }

Если вы хотите динамически создавать компоненты QML, вы можете сделать это следующим образом:

function addComponent(){ 
    var comp = Qt.createComponent("ComponentFile.qml") 
    var sprite = comp.createObject(myParent) //myParent should be whatever you want to add the component to 
} 

Если вы хотите QML отвечать на сообщения C++, добавить сигнал на C++

signals: 
     void makeComponent(QString message); 

затем в QML Widget, вы можете поставить функцию, когда этот сигнал называется

Foo{ 
id: foo 
onMakeComponent: { 
    console.log(message); 
    addComponent() 
} 
} 

Если вы не знакомы с тем, как сигналы работают, это довольно просто. В методе на C++, вы просто использовать ключевое слово испускают затем вызвать его, как это метод

void myFunc(){ 
    //Do some stuff 
    emit(makeComponent(someString)); 
} 

Если вы хотите, чтобы ваш вновь созданный QML элемент для передачи данных обратно в C++

  • Дайте ваш компонент идентификатор
  • Подключите компонентный сигнал к вашему классу C++
  • Когда ваш компонент излучает сигнал, включите его идентификатор в вызов C + +

    функция addComponent (ComponentName) { вар комп = Qt.createComponent ("ComponentFile.qml") вар спрайтов = comp.createObject (myParent) sprite.name = ComponentName sprite.mySignal.connect (Foo. modifyComponent) }

    // В ComponentFile.qml сигнала mySignal (строка Val)

    функция sendSignal() { mySignal (имя) }

В заключение, я объяснил, как:

  • Have C++ вызывать функции в QML
  • Как вызвать функции C++ из QML
  • Как создать новые элементы динамически в QML
  • Как заставить эти новые элементы вызывать функции C++

Это должно быть все, что вам нужно для передачи данных между QML и C++

+0

Это пункт. Все это я знаю уже. Моя проблема, например, когда я создаю новый элемент, мне нужно будет отправить сигнал до qml, чтобы создать связанный объект qml, связанный с этим объектом. I –

+0

Извините, я не совсем понимаю, о чем вы спрашиваете. Не использует ли метод addComponent() то, что вы спрашиваете? – faraza

+0

Извините, я не объяснял так хорошо, как должен. Я пытаюсь достичь этой архитектуры, где я создаю объекты в C++, и это визуальное представление объектов - это QML. Метод addComponent() создает объект из QML, отличный от его создания из C++. Кроме того, как только этот объект создается, как ссылка объекта на C++. В конце моя цель состоит в том, чтобы иметь в C++ логику, а в QML - UI/Visual. Возможно, я не правильно использую архитектуру QML или что-то подобное. Еще раз спасибо за помощь –

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