好的,我知道如何从 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,但我需要有相同的对象,这样我才能对连接的客户端进行操作。
我尝试使用此方法注入(inject) 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
最佳答案
为什么不在 elemB 上为您的属性(property)设置别名:
ElemB
{
property alias myClassInElemB: myClass
MyClass
{
id: myClass
...
}
}
在您的代码中,您可以这样做:elemB.myClassInElemB = myClass
。
但是,我认为您的代码中存在概念问题。为什么您只使用 ElemA
和 ElemB
对象而不是 Container
的 states
属性?为什么在 ElemA.qml(ElemA
的源代码)中调用 elemB.myClass = myClass
?解决这个问题可能会让你写出更简单的东西,避免 myClass
出现这个问题。你能告诉我们更多关于你的代码的信息吗?
关于javascript - 来自 C++ 对象的 QML 调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081241/