是否可以从C ++访问QML锚点?

时间:2016-01-11 12:36:49

标签: qml qt5 qtquick2

从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
    // ...
}   

3 个答案:

答案 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.topanchors.bottom等,并通过手动计算关联边距,setX()setY()也可能需要这样做。