来自C ++对象的QML调用方法

时间:2012-08-22 20:51:37

标签: javascript c++ qt qml

好的,我知道如何从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 ++对象实例:

  • 第一个州(ElemA)正在等待客户连接并接受它们
  • 第二州(ElemB)正在玩游戏

现在,一旦我接受了足够的客户端连接,我想开始游戏并切换到状态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

1 个答案:

答案 0 :(得分:1)

为什么不在elemB上的属性上设置别名:

ElemB
{
    property alias myClassInElemB: myClass

    MyClass
    {
        id: myClass
        ...
    }
}

在您的代码中,您可以执行此操作:elemB.myClassInElemB = myClass

但是,我认为您的代码中存在概念问题。为什么您使用ElemAElemB对象而不是states的{​​{1}}属性?为什么在ElemA.qml中调用Container(源代码为elemB.myClass = myClass)?解决此问题可能使您能够编写更简单的内容并使用ElemA来避免此问题。你能告诉我们你的代码的更多信息吗?