从c ++代码创建QML QQuickItems
时,是否可以访问/修改anchors
?
anchors
中所有Q_PRIVATE_PROPERTY
属性都被声明为QQuickItem
,我看不到任何有用的方法。
或者我是否必须通过使用信号/事件和anchors
自行实施QLayout
?
我需要的是例如:
Rectangle {
// ...
anchors.bottom: parent.bottom
anchors.bottomMargin: 0
anchors.top: parent.top
anchors.topMargin: 0
anchors.right: parent.right
anchors.rightMargin: -10
// ...
}
答案 0 :(得分:2)
实际上有一类锚。即QQuickAnchors
位于QtQuick/private/qquickanchors_p_p.h
并处理它们属于QQuickItemPrivate
。但由于这两个类都不是公共API的一部分,因此anwer是:不,你不能从C ++中访问或修改锚。
我会考虑这个好的API设计而不是限制。它会强制您管理它们所属的QML中的视觉属性。因此,我建议不要通过new QQmlComponent()
从C ++创建QML组件,而是直接在QML中使用已注册的自定义类型(可以使用Repeater
和/或Loader
组件静态或动态地完成)您可以访问Item
的{{1}}和所有其他视觉属性。
答案 1 :(得分:2)
与之前的答案不同,它既可能又具有有效的用例。所有Qt对象,甚至是私有对象,都有内省API。您在QML引擎中使用的那些API。它们也可以在C ++中使用:
qvariant_cast<QObject*>(
item->property("anchors")
)->setProperty("top", otherItem->property("bottom"));
请注意,存在竞争条件,因为涉及某些线程。
QML仅支持模型列表。显示其他结构(如树或表)要么执行得很糟糕(QtQuickControls 1.x),要么是低效率(递归中继器)。对于某些数据结构,C ++也是正确实现延迟加载的唯一方法。 QML Loader
有很长的路要走,但并非一直如此。
答案 2 :(得分:1)
对于绑定到父级的锚点,我发现以下内容作为&#34;设置来自c ++&#34;的anchors.fill: parent
的解决方案。当您没有在QML中实例化自定义类型时出现的问题(例如,您必须提供一个干净的API来动态创建QML对象):
class MyItem : public QQuickItem {
Q_OBJECT
public:
explicit MyItem(QQuickItem* parent){
if(parent){
connect(parent, SIGNAL(widthChanged()), this, SLOT(parentWidthChanged()));
connect(parent, SIGNAL(heightChanged()), this, SLOT(parentHeightChanged()));
setWidth(parent->width());
setHeight(parent->height());
}
else
qWarning() << "MyItem must be initialized with a parent.";
}
private slots:
void parentWidthChanged(){
setWidth(parentItem()->width());
}
void parentHeightChanged(){
setHeight(parentItem()->height());
}
};
可以遵循类似的逻辑来模拟anchors.top
,anchors.bottom
等,并通过手动计算关联边距,setX()
和setY()
也可能需要这样做。