首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果QML组件是以编程方式从C++创建的,则不显示

如果QML组件是以编程方式从C++创建的,则不显示
EN

Stack Overflow用户
提问于 2022-05-20 11:22:19
回答 1查看 43关注 0票数 0

我的目标是创建一个自定义组件(让我们称之为ComponentLoader),它可以通过委托实例化另一个组件(让我们称之为DelegateComponent)。

问题是DelegateComponent实例在创建后不会显示(白色屏幕)。注意:存在tst_component is loaded消息,这意味着实际创建了DelegateComponent实例。

下面是一个很小的例子:

main.qml

代码语言:javascript
复制
ApplicationWindow {
    id: mainWindow
    width: 640
    height: 480
    visible: true

    Component {
        id: tst_component

        Rectangle {
            anchors.fill: parent

            Component.onCompleted: {
                console.debug("tst_component is loaded");
            }

            Label {
                text: "hello world"
                anchors.centerIn: parent
            }
        }
    }

// doesn't work
    ComponentLoader {
        anchors.fill: parent
        delegate: tst_component
    }

// works
//    Loader {
//        anchors.fill: parent
//        sourceComponent: tst_component
//    }
}

组件加载器.h+ componentloader.cpp

代码语言:javascript
复制
#pragma once
#include <QQuickItem>

class ComponentLoader : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(QQmlComponent* delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)

public:
    QQmlComponent* delegate() const;
    void setDelegate(QQmlComponent*);

signals:
    void delegateChanged();

private:
    void generate();

protected:
    void componentComplete() override;

private:
    QQmlComponent* mDelegate = nullptr;
};

// componentloader.cpp
#include "componentloader.h"
#include <QtWidgets/QtWidgets>
#include <QtQmlModels/QtQmlModels>
#include <QQuickWindow>

QQmlComponent* ComponentLoader::delegate() const
{
    return mDelegate;
}

void ComponentLoader::setDelegate(QQmlComponent* delegate)
{
    if (delegate != mDelegate)
    {
        mDelegate = delegate;
        emit delegateChanged();
    }
}

void ComponentLoader::componentComplete()
{
    QQuickItem::componentComplete();
    generate();
}

void ComponentLoader::generate()
{
    QQmlEngine* engine = qmlEngine(this);
    QQmlContext* root_ctx = engine->rootContext();
    QQmlContext* ctx = new QQmlContext(root_ctx);

    QObject* item = mDelegate->create(ctx);
    QQuickItem* quickItem = qobject_cast<QQuickItem*>(item);

    QQuickItem* quickParent = qobject_cast<QQuickItem*>(parent());
    quickItem->setParent(quickParent);
    quickItem->setParentItem(quickParent);
}
EN

回答 1

Stack Overflow用户

发布于 2022-05-20 13:45:29

quickParent指针采用的是QObject父()值,而不是QQuickItem parentItem()值。

当我尝试使用您的代码时,简单地将它更改为这样对我是有效的:

代码语言:javascript
复制
QQuickItem* quickParent = qobject_cast<QQuickItem*>(parentItem());

我也不认为您需要调用setParent()。只有setParentItem()。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72318119

复制
相关文章

相似问题

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