0

我有一个 C++ 插件系统,其中创建了 QQmlComponent 并在用户请求新插件实例时加载了 qml 文件。

目前我正在使用 setContextProperty() 来告诉 QML 正确初始化所需的 QObject。

mEngine->rootContext()->setContextProperty("controller", QVariant::fromValue(mController));
mComponent = new QQmlComponent(mEngine);
mComponent->loadUrl(QUrl{ "qrc:///MyPlugin.qml" });

问题是,在实例化第二个插件时,两者都将使用第二个插件的控制器,因为“控制器”在 QML 中是全局的。

Repeater {
    model: controller.numEntries

有没有办法在本地设置上下文属性(仅适用于当前实例)?

我找到了使用 setProperty() 或 QQmlIncubator 和 setInitialState() 的解决方案,但它们似乎都需要一个已经从我的组件创建的对象。但在我的插件中,我只定义了组件,该组件通过 Loader 项加载到主应用程序中。因此,在尝试这些方法时,我总是在项目的副本中设置值,而不是在我的后端创建的那个。

如何访问在 QML 中创建的组件的属性?

mComponent->findChild<QQuickItem*>("controller");

即使我在 MyPlugin.qml 中定义了该属性,也不会给我任何结果。

4

1 回答 1

0

也许您可以创建一个基于 QObject 的类并拥有一个插槽,而不是使用属性,您可以调用插槽来插槽在 C++ 中创建一个新属性并将其返回给 QML

控制器创建者.h

#ifndef CONTROLLERCREATOR_H
#define CONTROLLERCREATOR_H

#include <QObject>

class ControllerCreator : public QObject {
    Q_OBJECT
  public:
    explicit ControllerCreator(QObject *parent = nullptr);

  signals:

  public slots:
    int propertyCreator();

  private:
    int m_example;
};

#endif // CONTROLLERCREATOR_H

控制器创建者.cpp

#include "ControllerCreator.h"

ControllerCreator::ControllerCreator(QObject *parent)
    : QObject(parent), m_example(0)
{
}

int ControllerCreator::propertyCreator()
{
    m_example++;
    return m_example;
}

主文件

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include "ControllerCreator.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    ControllerCreator controllerCreator;
    engine.rootContext()->setContextProperty("creator", &controllerCreator);

    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
    return -1;

    return app.exec();
}

main.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Column{
        anchors.fill: parent
        Text{
            text: creator.propertyCreator()
            color: "blue"
        }

        Text{
            text: creator.propertyCreator()
            color: "red"

        }

        Text{
            text: creator.propertyCreator()
             color: "green"
        }

    }
}
于 2018-08-23T11:18:01.980 回答