将QObject *设置为QMLEngine根上下文属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将QObject *设置为QMLEngine根上下文属性相关的知识,希望对你有一定的参考价值。
在我目前基于Qt-Quick-UI的C ++应用程序中,我想在我的UI中使用QObject
创建一个Q_PROPERTY(QAbstractListModel * ...)
:
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;
}
基于documentation,我理解这应该起作用的方式是在例如我的main.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
线,在那里设置断点并运行调试器(在尝试了无数其他方法来检查为什么没有显示之后)的原因。
当比较存储在MyObject
类中的BackendController
指针(以及getter返回的指针)与rcontext
中设置的context属性时,存在不匹配。调试器声明我设置的“myobject”属性是QVariant<bool>
(评估为true
),并且当提取实际存储的值(即应该是QObject*
)时,它与传递给setContextProperty
函数的指针I不同。
我注意到同样的行为,即使从main()
范围传递指针,如app.get()
,但是当传递QVariant
“primitives”(如QString
s)时,它们会被注册而没有问题。
如果这是相关的:在初始化QQmlApplicationEngine
之后和加载实际的QML文件之前,我还为QML可能接触的所有对象类型(即MyObject
和MyListModel
)注册(不可创建的)QML类型并导入相应的伪 - QML模块也是如此 - 无济于事。
所以我现在想知道这里发生了什么。在给出setContextProperty
类型的参数时,这是Qt 5.10如何评估QObject*
函数的一些缺陷吗?或者我是否在我的设置中忽略了一些东西?
事实证明,我的错误是使MyClass
吸气功能(controller.getMyObject()
)成为const
功能。显然,setContextProperty()
函数需要一些QVariant
或绝不是const
QObject*
。
以上是关于将QObject *设置为QMLEngine根上下文属性的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
QObject 使用 setParent() 将 QList 设置为父级