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

标签 c++ qt qml

在我当前的基于 Qt-Quick-UI 的 C++ 应用程序中,我想制作一个 QObjectQ_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 中设置的上下文属性, 存在不匹配。调试器声明我设置的“myobject”属性是 QVariant<bool> (评估为 true ),并且在提取实际存储值时(即应该是 QObject* ),它不同于我传递给 setContextProperty 的指针功能。

即使从 main() 传递指针时,我也注意到相同的行为范围,例如 app.get() , 但是当通过 QVariant “原语”(如 QString s)他们可以毫无问题地注册。

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

所以我现在想知道这里发生了什么。这是 Qt 5.10 如何评估 setContextProperty 的一些缺陷吗?给定时的功能 QObject*类型参数?还是我在这里的设置中严重忽略了某些内容?

最佳答案

事实证明,我的错误是将 MyClass getter 函数 (controller.getMyObject()) 设为 const 函数。显然,setContextProperty() 函数需要一些 QVariant绝不 const QObject*

关于c++ - 将 QObject* 设置为 QMLEngine 根上下文属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055536/

相关文章:

c++ - 实现附加对象: Unclear Documentation Example

javascript - Qt QScript 加密

c++ - 我怎么能通过 boost 来制作像 QFutureWatcher 这样的东西

qt - 是否可以在Qt Quick应用程序中实现SystemTrayIcon功能

c++ - 如何谷歌模拟从结构调用的方法

c++ - 如何检查QImage是否有效?

qt - 如何更改 Qml 中 ListView 滚动条的位置

c++ 转换运算符没有候选更好

c++ - 计算连续 1 位的最快方法。 C++

c++ - 初始化 union 内的结构 (C++)