我有一个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中定义了属性,也没有给我任何结果。
答案 0 :(得分:0)
也许您可以创建一个基于QObject的类并具有一个插槽,而不是使用属性,而是可以调用slot到插槽在c ++中创建一个新属性并将其返回给QML
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
| 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 |
#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
#include "ControllerCreator.h"
ControllerCreator::ControllerCreator(QObject *parent)
: QObject(parent), m_example(0)
{
}
int ControllerCreator::propertyCreator()
{
m_example++;
return m_example;
}