简体   繁体   中英

QML call method from C++ object

Ok, I know how to call C++ method from QML, but in this case it is not working.

This is how my code looks like (its not actual code since it is very big):

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 and ElemB are basically states, from which I switch. It goes like this: everything starts in state ElemA, then I can switch into ElemB, but when I switch, method() is not working (as I said above, no errors or warnings).

I am pretty sure that something goes wrong (or maybe is not allowed, but somehow it passes) when I put "elemB.myClass = myClass", in other words, that I cannot pass C++ object as property to some other element (withing QML).

So my question is how I am supposed to solve this?


EDIT: My code is game actually. I have many Elem's, each Elem represents one state (for example, ElemMenu is game menu, when I press some button like "Options", it switches me to ElemOptions state where I can do some other things).

MyClass is C++ implementation for networking. Now problem is that I need to have one instance of c++ object between 2 states (networking):

  • 1st state (ElemA) is waiting for clients connections and accepting them
  • 2nd state (ElemB) is playing game

Now once I accept enough client connections, I want to start game and switch to state ElemB but I need to have same object so I can manipulate with connected clients.


I have tried to inject myClass using this method: viewer.rootContext()->setContextProperty("myClass", new MyClass()); but then I am unable to use "myClass" with Connections element in QML (says that myClass property is undefined, but I can do method invocation like myClass.something() .

What I am thinking right now to reimplement MyClass, and make it static. Then I could make in ElemA and ElemB instances of MyClass, but I would rather not if possible.

QtMobility is not option for me right now.

I am using QT 1.8.1 with QtCreator 2.5

Why not setting an alias on your property on elemB :

ElemB
{
    property alias myClassInElemB: myClass

    MyClass
    {
        id: myClass
        ...
    }
}

In your code, you can do this : elemB.myClassInElemB = myClass .

However, I think there is a problem of conception in your code. Why do you use just like ElemA and ElemB objects instead of the states property of your Container ? Why do you call elemB.myClass = myClass in ElemA.qml (source code of ElemA ) ? Solving this problem may enable you to write more simple things and avoid this problem with myClass . Can you tell us more about your code ?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM