2016-09-08 13 views
1

ゲームを開発しようとしていますが、ゲームに関連するだけでなく何かに関連しています。 私の質問は:どのようにC++でオブジェクトを作成/削除/管理し、qmlで表示/消滅/変更するのですか?QtオブジェクトをC++で作成し、QMLに公開

は、私は多くのユーザーが読むことを私に教えてくれることを知っている

http://doc.qt.io/qt-4.8/qtbinding.html

http://doc.qt.io/qt-5/qtqml-cppintegration-contextproperties.html

http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html

http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html

のように...

私はそれらのすべてを読んだ。私は何とかそれを何とか使う方法を知っています。数字を変更する例のように、それはプロパティであり、QMLにさらされるので自動的に変更されますが、それは私の質問ではありません。

はその後、我々は、メインとすべての必要なsubclases内のC++のすべてのロジックを実装しますのは、たとえば

class Unit { 

int posX, posY; 
int energy; 

void move()... 
void create()... 
void kill() 
} 

のためのいくつかの簡単なコードを入れてみましょう。基本的にはユニットに関連したUIを処理することですが、私は繰り返し

Game.cpp 
class Game { 
QList<Unit> listUnits; 

moveUnits() { 
for (int i = 0; i < units.size(); i++){ 
Unit unit; 
unit.move(); 
} 

createNewUnit(){ 
Unit unit = new Unit(); 
listUnits.append(unit); 
} 
} 

On the other side will have Unit.qml 

Item{ 
property int posX; 
property int posY; 
Animation on X {...} 
....  
} 

、すべてのロジックは、C++で再びで行われます。

上記の例では、新しいユニットを作成するときに、これがQMLのすぐ内側に表示されます。

どのようにすればいいですか?私は本当に確かに実行することが可能であり、私は確かに非常にシンプルですが、私はちょうど見つけ出しませんでした。私はコード、ヒント、リファレンス、チュートリアルは必要ありません。

私が以前に書いた電子メールの1つに実際に解決策がある場合は、私がまだ見つけられなかったため、詳細を説明してください。

ありがとうございます!ここで

答えて

4

はQMLにC++を接続する方法である

  • はQObjectからあなたのC++クラスの継承は、(それはまた、いくつかの前にQ_INVOKABLEマクロを追加public:
  • 上記Q_OBJECTマクロを持っていなければならないという意味くださいQ_INVOKABLE int doStuff(int myParam);

  • あなたのメインファイルで、QMLが見つけられるようにクラスを登録してください:qmlRegisterType<Foo>("MyFoo", 1, 0, "Foo");

  • は、あなたが今、QMLファイルにあなたのC++クラスを追加することができます
  • (qmlRegisterTypeで、私はパラメータ1と0を渡されたので、それが1.0であることに注意してください)あなたのQMLファイルimport MyFoo 1.0であなたのC++クラスをインポートします。 Foo { id: foo}など、QMLの別の場所からメソッドを呼び出すことができます。

    関数qmlDoSomething(ヴァル){ VAR newInt = foo.doStuff(val)で }

あなたが動的にQMLコンポーネントを作成したい場合は、このようにそれを行うことができます。

function addComponent(){ 
    var comp = Qt.createComponent("ComponentFile.qml") 
    var sprite = comp.createObject(myParent) //myParent should be whatever you want to add the component to 
} 

あなたはQMLは、C++

に信号を追加し、C++のメッセージに応答する場合あなたは信号がどのように動作するかに慣れていない場合は
signals: 
     void makeComponent(QString message); 

は、QMLウィジェットで、あなたはこの信号が呼ばれ

Foo{ 
id: foo 
onMakeComponent: { 
    console.log(message); 
    addComponent() 
} 
} 

する機能を置くことができ、それはかなり簡単です。 C++の方法では、あなたはちょうどあなたがあなたの新しく作成されたQMLの要素があなたを与えるC++

  • に戻ってデータを送信する場合はそれのように

    void myFunc(){ 
        //Do some stuff 
        emit(makeComponent(someString)); 
    } 
    

    方法を、それを呼び出して放出するキーワードを使用しますコンポーネント識別子

  • コンポーネント信号をC++クラスに接続
  • コンポーネントが信号を発信するときに、そのコンポーネントの識別子をC + +

    関数addComponent(コンポーネント名){ するvar COMP = Qt.createComponent( "ComponentFile.qml") VARスプライト= comp.createObject(myParent) sprite.name = componentNameでは sprite.mySignal.connect(FOO。 modifyComponent) }

    // ComponentFile.qml 信号mySignal(列ヴァル)において

    機能sendSignal(){ mySignal(名)

    }
  • 動的
  • QMLに新しい要素を作成する方法QML
  • からC++の関数を呼び出す方法をQML
  • 内の関数を呼び出す

    • しているC:

    は要約すると、私がする方法を説明しましたこれらの新しい要素がC++関数を呼び出す方法

これは、データを渡す必要があるすべてのものでなければなりませんQMLとC++

+0

それはポイントです。私がすでに知っているこのすべて。私の問題は、たとえば、新しい要素を作成するときに、そのオブジェクトに関連付けられたqmlオブジェクトを作成するためにqmlまで信号を送る必要があるということです。私は –

+0

申し訳ありませんが、私はあなたが何を求めているのか本当に理解していません。 addComponent()メソッドはあなたが求めていることをしませんか? – faraza

+0

申し訳ありませんが私は良いと私は説明しませんでした。私はこのアーキテクチャを達成しようとしています。ここで私はC++でオブジェクトを作成し、このオブジェクトはQMLです。 addComponent()メソッドは、C++からオブジェクトを作成するのとは異なり、QMLからオブジェクトを作成しています。また、いったんそのオブジェクトが作成されると、どのようにオブジェクトをC++に参照するかが決まります。最終的に私の目的は、ロジックをC++に、UI /ビジュアルをQMLに持つことです。たぶん私はQMLのアーキテクチャや何かを正しく使っていないでしょう。助けてくれてありがとう –

関連する問題