我想在QML中绘制许多Rectangular。 Rectangulars(x,y)的坐标将在C ++中计算,需要传递给QML。
我试图寻找ListView或Column或Row元素(使用Repeater),但是这似乎没有解决问题,因为元素的排列方式与'tables'相似......我面临的缺乏信息这种情况下的网络示例。
更具体一点:
1.如何将我的Rectangular的许多坐标传递给QML? (什么数据结构)
2.我应该使用什么机制来显示它们?
答案 0 :(得分: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);
}
}
此代码将创建指定数量的矩形,并将它们随机放置在父矩形上。
如果在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()