QML对象的动态实例化?

fly*_*yer 4 qt qml

我想在QML中绘制许多Rectangular.Rectangulars(x,y)的坐标将在C++中计算,需要传递给QML.

我试图寻找的ListView或列或行元素(带中继器),但是这似乎不解决问题,因为元件排列像"表" ...我遇到的信息缺乏对网络上的例子这种情况.

更具体一点:
1.如何将我的Rectangular的许多坐标传递给QML?(什么数据结构)
2.我应该使用什么机制来显示它们?

dte*_*ech 16

你可以简单地说:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码将创建指定数量的矩形,并将它们随机放置在父矩形上.

如果在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);
    }    
};
Run Code Online (Sandbox Code Playgroud)

在main.cpp中注册:

qmlRegisterType<Positioner>("TestComponent", 1, 0, "Positioner");
Run Code Online (Sandbox Code Playgroud)

最后使用它,这次我们使用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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

您也可以使用现有的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
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的主要QML文件中,您实例化它:

var component = Qt.createComponent("TestItem.qml")
component.createObject(root)
Run Code Online (Sandbox Code Playgroud)

如果您不想在QML中实例化Positioner,而是在QML中实例化并使用单个对象,则可以执行以下操作(在main.cpp中):

Positioner p;
view.rootContext()->setContextProperty("sPositioner", &p);
Run Code Online (Sandbox Code Playgroud)

并在QML中使用:

var pos = sPositioner.getPosition()
Run Code Online (Sandbox Code Playgroud)