QQuickItem родительский элемент null в конструкторе - PullRequest
2 голосов
/ 10 февраля 2020

Я заинтересован в доступе к атрибутам родительского элемента qml через c ++ QQuickItem. У меня есть пользовательский элемент QQuick под названием VisibleTag и расширяет 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 opPi c.

Не понимаю ли я, как работает конструктор QQuickItem? Возможно ли получить доступ к родительскому элементу qml?

1 Ответ

2 голосов
/ 10 февраля 2020

Конструкция QQuickItem с помощью QML не:

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());
}
...