将 QObject* 设置为 QMLEngine 根上下文属性
Setting QObject* as QMLEngine root context property
在我当前基于 Qt-Quick-UI 的 C++ 应用程序中,我想为我的 UI 制作一个带有Q_PROPERTY(QAbstractListModel * ...)
QObject
:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(MyListModel* model READ model CONSTANT)
public:
const MyListModel* model() const {return m_model.get();}
private:
std::unique_ptr<MyListModel> m_model;
}
根据文档,我理解这应该工作的方式是,例如在我的主要.cpp中,我执行以下操作:
int main(int argc, char *argv[])
{
std::unique_ptr<QCoreApplication> app; // allows both console and GUI mode
BackendController controller; // holds a MyClass object and according (pointer-typed) getter
std::unique_ptr<QQmlApplicationEngine> qmlengine; // needed for GUI mode
if(GUI_MODE)
{
app.reset(new QApplication(argc, argv));
qmlengine.reset(new QQmlApplicationEngine(app));
qmlengine->rootContext()->setContextProperty("myobject", controller.getMyObject());
engine.load(QUrl(QStringLiteral("qrc:/uimain.qml")));
auto rcontext = qmlengine->rootContext();
} // else ...
return app->exec();
}
我希望能够在我的 QML 中做这样的事情:
ListView {
id: listview
model: myobject.model
delegate: Text {
text: "An entry"
}
}
但是,即使我确保MyListModel
中有条目,我的ListView
也保持为空。这就是为什么我输入auto rcontext
行,在那里设置断点并运行调试器的原因(在尝试了无数其他方法来检查为什么没有显示之后)。
将存储在BackendController
类中的MyObject
指针(以及 getter 返回的指针)与rcontext
中设置的上下文属性进行比较时,存在不匹配。调试器指出我设置的"myobject"属性是一个QVariant<bool>
(计算结果为true
),并且在提取实际存储值(即应该是QObject*
)时,它与我传递给setContextProperty
函数的指针不同。
即使从main()
范围传递指针,我也注意到相同的行为,例如app.get()
,但是当传递QVariant
"基元"(如QString
s)时,它们可以毫无问题地注册。
如果这是相关的:在初始化QQmlApplicationEngine
之后和加载实际的 QML 文件之前,我还为 QML 可能接触的所有对象类型注册了(不可创建的)QML 类型(即MyObject
和MyListModel
)并在 QML 中导入了相应的伪模块 - 无济于事。
所以我现在想知道这里发生了什么。这是Qt 5.10在给定QObject*
类型参数时如何评估setContextProperty
函数的一些缺陷吗?还是我在这里严重忽略了设置中的某些内容?
事实证明,我的错误是将MyClass
getter函数(controller.getMyObject()
)设为const
函数。显然,setContextProperty()
函数要么期望一些QVariant
,要么绝不const
QObject*
。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 可以从C++在QML上编写上下文属性吗?
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 将 QObject* 设置为 QMLEngine 根上下文属性
- 是否可以列出 QQmlContext 的上下文属性名称
- Qt-Qml连接到上下文属性的QObject属性的信号
- 如何将 C++ 插件属性公开给 QML 上下文
- 有没有办法将别名模板推导到模板模板参数,同时仍保留其被推导上下文的属性
- 如何在 QML 文件中查找属性名称为字符串的 QML 上下文属性
- OpenCL C++上下文属性语法
- QQuickWindow 上下文属性
- 从c++中设置GridView模型属性而不设置上下文