簡體   English   中英

如果 QML 組件是從 C++ 以編程方式創建的,則不會顯示它

[英]QML component isn't displayed if it was created programmatically from C++

我的目標是創建一個自定義組件(我們稱之為ComponentLoader ),它可以通過委托實例化另一個組件(我們稱之為DelegateComponent )。

問題是創建后沒有顯示DelegateComponent的實例(白屏)。 注意: tst_component is loaded消息 IS 存在,這意味着實際上創建了DelegateComponent實例。

這是一個最小的例子:

main.qml

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 + 組件加載器.cpp

#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);
}

您的quickParent指針采用 QObject parent() 值而不是 QQuickItem parentItem() 值。

當我嘗試您的代碼時,只需將其更改為對我有用:

QQuickItem* quickParent = qobject_cast<QQuickItem*>(parentItem());

我也不認為你需要調用 setParent() 。 只需 setParentItem()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM