2016-09-08 108 views
1

我试图开发一款游戏,但不仅与游戏有关,而且与任何事情有关。 我的问题是:如何在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中。

怎么办?我真的很有把握可以完成,我确定很简单,我只是没有发现。我不需要代码,只需提示,或参考或教程。

如果解决方案真的出现在我之前写过的其中一封电子邮件上,我请您更详细地解释它,因为我还没有发现。

非常感谢!

回答

4

这里是如何C++连接到QML

  • 建立从QObject中你的C++类的继承(这意味着它也应该有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(VAL){VAR = newInt foo.doStuff(VAL) }

如果要动态创建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++方法,你只需要使用关键字emit然后调用它喜欢它的方法

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

如果你希望你的新创建QML元素将数据发送回C++

  • 给你分量标识符
  • 您的分量信号连接到C++类
  • 当您的组件发出的信号,使之包括其在调用C标识符+ +

    功能addComponent(组件名称){ VAR补偿= Qt.createComponent( “ComponentFile.qml”) VAR精灵= comp.createObject(myParent) sprite.name =组件名 sprite.mySignal.connect(FOO。 modifyComponent) }

    //在ComponentFile.qml 信号mySignal(串VAL)

    功能sendSignal(){ mySignal(名称) }

总之,我已经解释了如何:

  • 有无C++调用函数QML
  • 如何调用C++函数从QML
  • 如何动态地在QML
  • 创建新元素如何使这些新的元素称为C++函数

这应该是你需要传递数据的一切QML和C++

+0

那就是要点。这一切我已经知道了。我的问题是,例如,当我创建一个新元素时,我需要发送一个信号直到qml,以创建与该对象关联的关联qml对象。我 –

+0

对不起,我真的不明白你在问什么。 addComponent()方法不会做你所问的东西吗? – faraza

+0

对不起,我没有解释我应该如此好。我试图实现这个架构,我在C++中创建对象,这个对象的可视化表示是一个QML。 addComponent()方法从QML创建对象,与从C++创建对象不同。另外,一旦创建了该对象,如何将该对象引用到C++中。最后,我的目标是在C++中使用逻辑,在QML中使用UI/Visual。也许我没有正确使用QML架构或某些东西。再次感谢您的帮助 –