Вы могли бы просто:
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()
мой вопрос кажется отрывочным. «случайным» я имел в виду нечто нерегулярное, а не как ListView, которое определяет макет ... В вашем примере позиционер создается в QML. Как я могу написать в Positioner из внешнего класса C++, который существует перед представлением QML? Может ли Позиционер быть одиночным с статическим доступом? – flyer
Ну, вам не нужен список, вам не нужна сетка, вам не нужны случайные, тогда что именно вы подразумеваете под нерегулярным? – dtech
Добавлен способ создания «Позиционера» на C++ и использования в QML в конце ответа. – dtech