あなたは簡単にできます:
import QtQuick 2.0
Rectangle {
id: root
height: 500
width: 500
property string sc: 'import QtQuick 2.0; Rectangle {width: 20; height: 20; color: "red"; Component.onCompleted: {x = Math.random() * parent.width; y = Math.random() * parent.height;}}'
Component.onCompleted: {
for (var i = 0; i < 10; ++i) Qt.createQmlObject(sc, root, 'obj' + i);
}
}
このコードは、指定された数の長方形を作成し、それらを親の長方形の上にランダムに配置します。
C++ で位置を生成する必要がある場合は、カスタム C++ 要素を作成する必要があります。基本的な例を次に示します。
class Positioner : public QObject
{
Q_OBJECT
public:
explicit Positioner(QObject *parent = 0) : QObject(parent) {}
public slots:
QPointF getPosition() {
return QPoint(qrand() % 500, qrand() % 500);
}
};
main.cpp に登録します。
qmlRegisterType<Positioner>("TestComponent", 1, 0, "Positioner");
最後にそれを使用します。今回はポジショナーのgetPosition()
C++ スロットを使用します。
import QtQuick 2.0
import TestComponent 1.0
Rectangle {
id: root
height: 500
width: 500
Positioner {id: myPositioner}
property string sc: 'import QtQuick 2.0; Rectangle {width: 20; height: 20; color: "red"; Component.onCompleted: {var pos = myPositioner.getPosition(); x = pos.x; y = pos.y;}}'
Component.onCompleted: {
for (var i = 0; i < 10; ++i) Qt.createQmlObject(sc, root, 'obj' + i);
}
}
文字列の代わりに既存の QML ファイルを使用することもできます。これは、オートコンプリートが得られるため、もう少し便利です。それが TestItem コンポーネントであり、楽しみのために、クリックするとそのインスタンスが削除されます。
import QtQuick 2.0
Rectangle {
width: 100
height: 100
color: "black"
MouseArea {
anchors.fill: parent
onClicked: parent.destroy()
}
Component.onCompleted: {
var pos = myPositioner.getPosition()
x = pos.x
y = pos.y
}
}
そして、メインの QML ファイルでインスタンス化します:
var component = Qt.createComponent("TestItem.qml")
component.createObject(root)
QML でポジショナーをインスタンス化せず、代わりに QML で単一のオブジェクトをインスタンス化して使用したくない場合は、次のことを実行できます (main.cpp で)。
Positioner p;
view.rootContext()->setContextProperty("sPositioner", &p);
そしてQMLで使用します:
var pos = sPositioner.getPosition()