将QObject *设置为QMLEngine根上下文属性

问题描述 投票:0回答:1

在我目前基于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”(如QStrings)时,它们会被注册而没有问题。

如果这是相关的:在初始化QQmlApplicationEngine之后和加载实际的QML文件之前,我还为QML可能接触的所有对象类型(即MyObjectMyListModel)注册(不可创建的)QML类型并导入相应的伪 - QML模块也是如此 - 无济于事。

所以我现在想知道这里发生了什么。在给出setContextProperty类型的参数时,这是Qt 5.10如何评估QObject*函数的一些缺陷吗?或者我是否在我的设置中忽略了一些东西?

c++ qt qml
1个回答
1
投票

事实证明,我的错误是使MyClass吸气功能(controller.getMyObject())成为const功能。显然,setContextProperty()函数需要一些QVariant或绝不是const QObject*

© www.soinside.com 2019 - 2024. All rights reserved.