2

我有兴趣通过 c++ QQuickItem 访问 qml 父级的属性。我有一个名为 VisibleTag 的自定义 QQuick 项目,它扩展了 QQuickItem。任何包含此对象标记的 qml 项目,我想根据我在代码中设置的其他因素设置为可见或不可见,我出于此问题的目的临时删除了这些因素。但是,我遇到了一个问题,即我的父指针在构造时为空。

//main.cpp
#include <QtQuick/QQuickView>
#include <QGuiApplication>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<VisibleTag>("VisibleTag", 1, 0, "VisibleTag");

    QQuickView view;
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.setSource(QUrl("qrc:///app.qml"));
    view.show();
    return app.exec();
}

//app.aml
Rectangle{
    id: opPic
    height: 100
    width: 100
    color: "red"
    VisibleTag{}
}
//header
class VisibleTag : public QQuickItem
{
    Q_OBJECT
public:
    VisibleTag( QQuickItem* parent = nullptr );

private:
    bool isVisible() { return false; } //this is a dummy function for testing my issue
}
//cpp
VisibleTag::VisibleTag( QQuickItem* parent )
    : QQuickItem( parent )
{
    //qDebug() << parent->objectName(); //This line will break because parent is null
    parent->setVisible( isVisible() );
}

我希望让父指针指向 qml 的可视父项。在示例中,我希望 parent 指向 Rectangle opPic。

我是否误解了 QQuickItem 构造函数的工作原理?是否可以访问 qml 视觉父级?

4

1 回答 1

3

QML 构造 QQuickItem 不是:

T* o = new T(parent);

T* o = new T;
T->setParentItem(parent);

因此,您无法在构造函数中获取父级,但必须在componentComplete()方法中进行(类似于Component.onCompleted在 QML 中):

#ifndef VISIBLETAG_H
#define VISIBLETAG_H

#include <QQuickItem>
class VisibleTag : public QQuickItem
{
    Q_OBJECT
public:
    VisibleTag(QQuickItem *parent=nullptr);
protected:
    void componentComplete();
private:
    bool dummy() { return false; }
};

#endif // VISIBLETAG_H
#include "visibletag.h"

VisibleTag::VisibleTag(QQuickItem *parent):QQuickItem(parent)
{
}
void VisibleTag::componentComplete()
{
    if(parentItem())
        parentItem()->setVisible(dummy());
}
于 2020-02-10T20:45:57.740 回答