好的,我知道如何从QML调用C ++方法,但在这种情况下它不起作用。
这就是我的代码的样子(它不是真正的代码,因为它非常大):
Container //this is my main qml element, where is everything contained and started
{
ElemA
{
id: elemA
...
}
ElemB
{
id: elemB
...
}
}
ElemA
{
MyClass
{
id: myClass
...
}
//myClass.method() //runs fine
//Now I call: elemB.myClass = myClass
//after that, if I call method() it doens't work (below is code)
}
ElemB
{
property MyClass myClass
//myClass.method() //doesn't run at all, neither shows any errors or warnings
}
ElemA和ElemB基本上是状态,我可以从中切换状态。它是这样的:一切都从状态ElemA开始,然后我可以切换到ElemB,但是当我切换时,method()不起作用(如上所述,没有错误或警告)。
当我把“elemB.myClass = myClass”,换句话说,我无法将C ++对象作为属性传递给我时,我很确定会出现问题(或者可能是不允许的,但不知何故它会通过)其他一些元素(使用QML)。
所以我的问题是我应该如何解决这个问题?
编辑:我的代码实际上是游戏。我有很多Elem,每个Elem代表一个状态(例如,ElemMenu是游戏菜单,当我按下“选项”之类的按钮时,它会切换到ElemOptions状态,我可以做其他事情。)
MyClass是用于网络的C ++实现。 现在问题是我需要在两个状态(网络)之间有一个c ++对象实例:
现在,一旦我接受了足够的客户端连接,我想开始游戏并切换到状态ElemB,但我需要拥有相同的对象,以便我可以使用连接的客户端进行操作。
我尝试使用此方法注入myClass: viewer.rootContext() - > setContextProperty(“myClass”,new MyClass()); 但是我无法在QML中使用带有 Connections 元素的“myClass”(表示myClass属性未定义,但我可以像 myClass.something()那样进行方法调用。
我现在正在考虑重新实现MyClass,并将其设置为静态。然后我可以在MyClass的ElemA和ElemB实例中制作,但如果可能的话我宁愿不这样做。
QtMobility现在不适合我。
我正在使用QT 1.8.1和QtCreator 2.5
答案 0 :(得分:1)
为什么不在elemB上的属性上设置别名:
ElemB
{
property alias myClassInElemB: myClass
MyClass
{
id: myClass
...
}
}
在您的代码中,您可以执行此操作:elemB.myClassInElemB = myClass
。
但是,我认为您的代码中存在概念问题。为什么您使用ElemA
和ElemB
对象而不是states
的{{1}}属性?为什么在ElemA.qml中调用Container
(源代码为elemB.myClass = myClass
)?解决此问题可能使您能够编写更简单的内容并使用ElemA
来避免此问题。你能告诉我们你的代码的更多信息吗?