2012-08-22 70 views
0

好吧,我知道如何从QML调用C++方法,但在这种情况下它不起作用。来自C++对象的QML调用方法

这是我的代码看起来像(它不是实际的代码,因为它是非常大的):

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++实现。 现在的问题是,我需要有2种状态(网络)之间的对象的C++一个实例:

  • 1状态(ElemA)正在等待客户端的连接,并接受他们
  • 第二状态(ElemB)被打游戏

现在,一旦我接受了足够的客户端连接,我想开始游戏并切换到状态ElemB,但我需要具有相同的对象,以便我可以使用连接的客户端进行操作。


我曾尝试使用这种方法注入myClass的:viewer.rootContext() - > setContextProperty( “myClass的”,新MyClass的()); 后来,我无法使用“myclass”的连接在QML元素(说MyClass的属性未定义,但我可以做的方法调用像myClass.something()

我在想什么现在重新实现MyClass的,并使其静态的。然后,我可以MyClass中的ElemA和ElemB情况下做出的,但我宁愿不如果可能的话。

QtMobility的,不是我的选择现在。

我使用Qt 1.8.1和QtCreator 2。5

回答

1

为什么不设置上elemB你的财产的别名:

ElemB 
{ 
    property alias myClassInElemB: myClass 

    MyClass 
    { 
     id: myClass 
     ... 
    } 
} 

在你的代码,你可以这样做:elemB.myClassInElemB = myClass

但是,我认为你的代码中存在一个概念问题。为什么你只用ElemAElemB而不是你Containerstates属性?你为什么要在ElemA.qml中调用elemB.myClass = myClass(源代码为ElemA)?解决这个问题可以让你写更简单的事情,并避免myClass这个问题。你能告诉我们更多关于你的代码吗?

+0

我已经添加了更多信息,尽管我会尽力使这样做。感谢您的帮助。 – DRAX