首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数中的QQuickItem父项为空

构造函数中的QQuickItem父项为空
EN

Stack Overflow用户
提问于 2020-02-11 04:00:37
回答 1查看 291关注 0票数 2

我对通过c++ QQuickItem访问qml父对象的属性很感兴趣。我有一个自定义的QQuick项,名为VisibleTag the extends。任何包含此对象标签的qml项,我都希望根据我在代码中设置的其他因素将其设置为可见或不可见,出于这个问题的目的,我暂时删除了这些因素。然而,我遇到了一个问题,我的父指针在构造时为空。

代码语言:javascript
复制
//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();
}
代码语言:javascript
复制
//app.aml
Rectangle{
    id: opPic
    height: 100
    width: 100
    color: "red"
    VisibleTag{}
}
代码语言:javascript
复制
//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
}
代码语言:javascript
复制
//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可视父级?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-11 04:45:58

通过QML构造QQuickItem不是:

代码语言:javascript
复制
T* o = new T(parent);

代码语言:javascript
复制
T* o = new T;
T->setParentItem(parent);

所以您不能在构造函数中获取父对象,但必须在componentComplete()方法中获取(类似于QML中的Component.onCompleted ):

代码语言:javascript
复制
#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
代码语言:javascript
复制
#include "visibletag.h"

VisibleTag::VisibleTag(QQuickItem *parent):QQuickItem(parent)
{
}
void VisibleTag::componentComplete()
{
    if(parentItem())
        parentItem()->setVisible(dummy());
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60157548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档