2016-08-11 23 views
3

QML内では、Qt.createQmlObjectを呼び出して、コンポーネントを(ファイルからロードするのではなく)動的に作成できます。例:C++でのQt.createQmlObjectに相当する

Qt.createQmlObject('import QtQuick 1.0; Rectangle {color: "red"; width: 20; height: 20}', parent, "dynamicPath"); 

C++コードから同じことを行う方法はありますか?必ずしもQMLを解析する必要はありません—私は、たとえば、C++のQMLドキュメントにRectangleまたはTextFieldを動的に作成して添付する方法を探しています。

答えて

3

廃止予定のQt Quick 1をお使いですか?

QDeclarativeView *view = ...; 
QDeclarativeItem *parent = ...; 

あなたが行うことができます:

QDeclarativeEngine *engine = view->engine(); 
QDeclarativeComponent component(engine); 
component.setData("import QtQuick 1.0; Rectangle {color: \"red\"; width: 20; height: 20}", QUrl("dynamicPath")); 
QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(component.create()); 
Q_ASSERT(item); 
item->setParentItem(parent); 

をあなたが実際に、代わりにQQml*QQuick*you'd replaceQDeclarative*をQtのクイック2を使用している場合、あなたは持っていることを考えます。

+0

完璧、ありがとうございます!そして、いいえ、Qt Quick 1に載っていません - 私はいくつかの古い文書のサンプルスニペットをコピーしました。 – spinda

+0

'QUrl(" dynamicPath ")はどこかに書かれていますか?それともちょうどあなたが与えた名前ですか? –

+0

[docs](http://doc.qt.io/qt-5/qqmlcomponent.html#setData)から:「_url_が提供されている場合は、コンポーネント名を設定し、アイテムの基本パスを提供するために使用されますこのコンポーネントによって解決されました。通常、人は空のURLを渡します。エラーが発生した場合は、空でないものを渡すだけで、エラーの原因を明確にすることができます。 – jpnurmi