Динамическое создание объектов QML?

Я хочу привлечь много Rectangular внутри QML. Координаты для Rectangulars (x, y) будут вычисляться внутри C ++ и должны быть переданы в QML.

Я попытался найти элементы ListView или Column или Row (с Repeater), но это не похоже на проблему, потому что элементы расположены так, как в «таблицах» … Я столкнулся с отсутствием информации о веб-примерах на такой случай.

Чтобы быть более конкретным:
1. Как передать много координат для моего Rectangular’s в QML? (какая структура данных)
2. Какой механизм я должен использовать для их отображения?

Вы могли бы просто:

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("TestComponent", 1, 0, "Positioner"); 

И, наконец, используйте его, на этот раз мы используем getPosition() Positioner:

  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() 
  • неопределенная ссылка на функцию шаблона
  • Как использовать модели с QML?
  • Добавление внешней библиотеки в проект Qt Creator
  • Ошибка: не удалось разрешить путь к SDK для 'macosx10.8'
  • Qt-сигналы (QueuedConnection и DirectConnection)
  • QMake - как скопировать файл на выход
  • Отображение изображения Qt jpg
  • Как нарисовать точку (на mouseclick) на QGraphicsScene?
  • Как сделать текст представления рендеринга богатым (html) текстом в Qt
  • Преобразование QString в char *
  • Не удалось отправить SMS с помощью команд AT
  • Давайте будем гением компьютера.