加载QML组件的SetProperty,不使用SetContextProperty

时间:2018-01-25 17:39:16

标签: initialization qqmlcomponent

我有一个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中定义了属性,

也没有给我任何结果。

1 个答案:

答案 0 :(得分:0)

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

ControllerCreator.h

SELECT date_time,
       TO_CHAR( FROM_TZ( CAST( date_time AS TIMESTAMP ), 'UTC' ) AT TIME ZONE 'EUROPE/LONDON', 'YYYY-MM-DD"T"HH24:MI:SS.FFTZH:TZM' ) AS london_date_time
FROM   table_name

ControllerCreator.cpp

|            DATE_TIME |                 LONDON_DATE_TIME |
|----------------------|----------------------------------|
| 2018-08-23T00:00:00Z | 2018-08-23T01:00:00.000000+01:00 |
| 2018-08-23T11:20:56Z | 2018-08-23T12:20:56.000000+01:00 |
| 2018-12-01T00:00:00Z | 2018-12-01T00:00:00.000000+00:00 |

main.cpp

#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

main.qml

#include "ControllerCreator.h"

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

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