首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QObject*设置为QMLEngine根上下文属性

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

Stack Overflow用户
提问于 2018-03-01 17:33:59
回答 1查看 926关注 0票数 0

在当前基于Qt-Quick的C++应用程序中,我希望使QObject具有一个对UI可用的Q_PROPERTY(QAbstractListModel * ...)

代码语言:javascript
复制
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;
}

基于文档,我理解它应该工作的方式是,例如,在我的main.cpp中,我做了以下工作:

代码语言:javascript
复制
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中做这样的事情:

代码语言:javascript
复制
ListView {
  id: listview
  model: myobject.model
  delegate: Text {
    text: "An entry"
  }
}

但是,即使我确保MyListModel中有条目,我的ListView仍然是空的。这就是为什么我放入auto rcontext行,在那里设置一个断点,并运行一个调试器(在尝试了无数其他方法来检查为什么没有显示)。

当比较存储在MyObject类中的BackendController类中的指针(以及getter返回的指针)到在rcontext中设置的上下文属性时,存在不匹配。调试器声明我设置的"myobject“属性是一个QVariant<bool> (对true的计算),当提取实际的存储值(即应该是QObject*)时,它不同于我传递给setContextProperty函数的指针。

即使在从main()范围传递指针(如app.get() )时,我也注意到了同样的行为,但是当传递QVariant“原语”(如QString)时,它们没有问题地注册。

如果这与此相关:在初始化QQmlApplicationEngine之后,在加载实际的QML文件之前,我还为QML可能接触的所有对象类型(即MyObjectMyListModel)注册了(不可创建的) QML类型,并在QML中导入了相应的伪模块,但没有结果。

所以我现在想知道这是怎么回事。这是QT5.10在给定setContextProperty参数时如何计算QObject*函数的缺陷吗?还是我完全忽略了我在这里的设置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-02 11:25:08

事实证明,我的错误是把MyClass getter函数(controller.getMyObject())变成了const函数。显然,const函数需要一些QVariant,而不是 QObject*

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49055536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档