0

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

  • 第一个状态 (ElemA) 正在等待客户端连接并接受它们
  • 2nd state (ElemB) 正在玩游戏

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


我尝试使用这种方法注入 myClass:viewer.rootContext()->setContextProperty("myClass", new MyClass()); 但后来我无法在 QML 中将“myClass”与Connections元素一起使用(说 myClass 属性未定义,但我可以像myClass.something()一样进行方法调用。

我现在正在考虑重新实现 MyClass,并使其成为静态的。然后我可以在 MyClass 的 ElemA 和 ElemB 实例中创建,但如果可能的话我宁愿不这样做。

QtMobility 现在不是我的选择。

我正在使用 QT 1.8.1 和 QtCreator 2.5

4

1 回答 1

1

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

ElemB
{
    property alias myClassInElemB: myClass

    MyClass
    {
        id: myClass
        ...
    }
}

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

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

于 2012-08-23T01:57:55.217 回答