2013-04-14 5 views
3

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

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

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

ответ

14

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

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() 
+0

мой вопрос кажется отрывочным. «случайным» я имел в виду нечто нерегулярное, а не как ListView, которое определяет макет ... В вашем примере позиционер создается в QML. Как я могу написать в Positioner из внешнего класса C++, который существует перед представлением QML? Может ли Позиционер быть одиночным с статическим доступом? – flyer

+0

Ну, вам не нужен список, вам не нужна сетка, вам не нужны случайные, тогда что именно вы подразумеваете под нерегулярным? – dtech

+0

Добавлен способ создания «Позиционера» на C++ и использования в QML в конце ответа. – dtech

Смежные вопросы