是否可以从C++;? < >从C++代码中创建QML QQuestBase,是否可以访问/修改?< /P>

是否可以从C++;? < >从C++代码中创建QML QQuestBase,是否可以访问/修改?< /P>,qml,qt5,qtquick2,Qml,Qt5,Qtquick2,在QQuickItem中,所有anchors属性都声明为Q_PRIVATE_属性,我看不到任何有帮助的方法 或者我必须通过使用信号/事件和QLayout自己实现锚定 我需要的是例如: Rectangle { // ... anchors.bottom: parent.bottom anchors.bottomMargin: 0 anchors.top: parent.top anchors.topMargin: 0 anchors.right: p

QQuickItem
中,所有
anchors
属性都声明为
Q_PRIVATE_属性
,我看不到任何有帮助的方法

或者我必须通过使用信号/事件和
QLayout
自己实现
锚定

我需要的是例如:

Rectangle {
    // ...
    anchors.bottom: parent.bottom
    anchors.bottomMargin: 0
    anchors.top: parent.top
    anchors.topMargin: 0
    anchors.right: parent.right
    anchors.rightMargin: -10
    // ...
}   

事实上,有一个锚类。即
QQuickAnchors
位于
qquick/private/QQuickAnchors\u p\u p.h
中,处理它们属于
QQuickItemPrivate
。但是由于这两个类不是公共API的一部分,所以ANWER是:不,不能从C++内部访问或修改锚。
我会考虑这个好的API设计,而不是限制。它强制您在QML中管理它们所属的可视属性。因此,我不建议通过C++来创建QML组件,而是通过Que>新QQMListTune()/Cuff>,我建议在QML中直接使用注册的自定义类型(可以用静态和动态的方式来完成),从这里可以访问<代码>项目<代码>代码>锚定< /代码>和所有其他视觉属性。p> 对于绑定到父对象的锚,我发现以下方法可以解决“设置
anchors.fill:parent
from c++”问题,该问题是在您没有足够的时间在QML中实例化自定义类型时出现的(例如,您必须提供一个干净的API来动态创建QML对象):

类MyItem:公共QQuickItem{
Q_对象
公众:
显式MyItem(QQuickItem*父项){
如果(家长){
连接(父,信号(widthChanged()),此,插槽(parentWidthChanged());
连接(父,信号(heightChanged()),此,插槽(parentHeightChanged());
设置宽度(父项->宽度());
设置高度(父级->高度());
}
其他的
qWarning()宽度());
}
void parentHeightChanged(){
setHeight(parentItem()->height());
}
};

可以遵循类似的逻辑来模拟
锚定。顶部
锚定。底部
等以及手动计算的相关边距,
setX()
setY()
也可能需要实现这一点。

与前面的答案不同,它既可能,又有有效的用例。所有Qt对象,甚至是私有对象,都有内省API。这些API是您从QML引擎使用的。它们也可以从C++中使用:

qvariant_cast<QObject*>(
    item->property("anchors")
)->setProperty("top", otherItem->property("bottom"));
qvariant\u cast(
项目->属性(“锚定”)
)->设置属性(“顶部”,其他项->属性(“底部”);
请注意,由于涉及一些线程,因此存在争用条件


QML只支持模型列表。显示其他结构,如树或表,要么实现得不好(QtQuickControls 1.x),要么效率低下(递归中继器)。对于某些数据结构,C++也是唯一实现正确加载延迟加载的方法。QML
Loader
走了很长一段路,但不是所有的路。

如果,如您所说,这是“良好的API设计”,请告诉我应该如何处理:1)必须创建具有自定义属性的QML组件(我目前继承QQuickItem以添加此类属性=>C++)2)同时必须定义QQuickItem的自定义布局-例如,添加带填充的图像,最好从QML@Zuzel嗯,这不是“我说的那样”。这是关于Qt如何从API设计的角度决定的。老实说,我认为在QML中设置布局属性是不够的。如果你有一个特定的问题,那就去问一个问题吧我想我只是问了一个问题并描述了一个特定的问题。。是的,这显然是他们的设计,你刚才说你认为这个特殊的案例是“好”的API设计实例之一。相反,我认为这是一个蹩脚API设计的例子。你愿意分享你的有效用例吗?依赖QML代码的C++代码并不那么好。尽管有一个地方它确实有意义,那就是测试。基于
QQuickItem
的高级布局。QtQuick始终假定(模型)数据是一个列表。内置容器优化不支持表、图表、图形、地图和树等其他结构。当然,无论如何都可以表示它们,但它不能缩放。有些布局,如 ListVIEW/CODE>已经内置了C++代码,以优化懒惰/异步加载场景。必须复制此代码,以获得与其他结构相同的性能。代码可以访问Qt私有API,而我们不能(除非您启用它,但这比使用内省API糟糕得多)。
qvariant_cast<QObject*>(
    item->property("anchors")
)->setProperty("top", otherItem->property("bottom"));