2016-09-08 85 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,所以它會自動更改,但那不是我的問題。

讓我們把一些簡單的代碼,例如

class Unit { 

int posX, posY; 
int energy; 

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

然後,我們將實現在C++中主要和所有必要的subclases內的所有邏輯。

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中。

怎麼辦?我真的很有把握可以完成,我確定很簡單,我只是沒有發現。我不需要代碼,只需提示,或參考或教程。

如果解決方案真的出現在我之前寫過的其中一封電子郵件上,我請您更詳細地解釋它,因爲我還沒有發現。

非常感謝!

回答

4

這裏是如何C++連接到QML

  • 建立從QObject中你的C++類的繼承(這意味着它也應該有Q_OBJECT宏觀上述public:
  • 添加Q_INVOKABLE宏的一些前你的公共方法,所以他們可以從QML調用。例如Q_INVOKABLE int doStuff(int myParam);

  • 在你的主文件中,註冊這個類,讓QML可以找到它:qmlRegisterType<Foo>("MyFoo", 1, 0, "Foo");

  • 導入你的C++類的QML文件import MyFoo 1.0(請注意,它是1.0,因爲在qmlRegisterType,我傳遞的參數1和0)
  • 您立即將C++類添加到QML文件。 Foo { id: foo}並且可以從QML的其他地方調用您的方法,例如

    功能qmlDoSomething(VAL){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的Widget,你可以把一個函數時,這個信號被稱爲

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

如果你不熟悉的信號是如何工作的,這是很簡單的。在C++方法,你只需要使用關鍵字emit然後調用它喜歡它的方法

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

如果你希望你的新創建QML元素將數據發送回C++

  • 給你分量標識符
  • 您的分量信號連接到C++類
  • 當您的組件發出的信號,使之包括其在調用C標識符+ +

    功能addComponent(組件名稱){ VAR補償= Qt.createComponent( 「ComponentFile.qml」) VAR精靈= comp.createObject(myParent) sprite.name =組件名 sprite.mySignal.connect(FOO。 modifyComponent) }

    //在ComponentFile.qml 信號mySignal(串VAL)

    功能sendSignal(){ mySignal(名稱) }

總之,我已經解釋瞭如何:

  • 有無C++調用函數QML
  • 如何調用C++函數從QML
  • 如何動態地在QML
  • 創建新元素如何使這些新的元素稱爲C++函數

這應該是你需要傳遞數據的一切QML和C++

+0

那就是要點。這一切我已經知道了。我的問題是,例如,當我創建一個新元素時,我需要發送一個信號直到qml,以創建與該對象關聯的關聯qml對象。我 –

+0

對不起,我真的不明白你在問什麼。 addComponent()方法不會做你所問的東西嗎? – faraza

+0

對不起,我沒有解釋我應該如此好。我試圖實現這個架構,我在C++中創建對象,這個對象的可視化表示是一個QML。 addComponent()方法從QML創建對象,與從C++創建對象不同。另外,一旦創建了該對象,如何將該對象引用到C++中。最後,我的目標是在C++中使用邏輯,在QML中使用UI/Visual。也許我沒有正確使用QML架構或某些東西。再次感謝您的幫助 –