获取当前上下文以设置对象列表模型

Posted

技术标签:

【中文标题】获取当前上下文以设置对象列表模型【英文标题】:Get current context to set Object list model 【发布时间】:2018-03-29 10:33:43 【问题描述】:

我想创建一个对象列表模型,如下例所示: http://doc.qt.io/qt-5/qtquick-models-objectlistmodel-example.html

要在 QML 中使用它,我需要设置上下文属性

ctxt->setContextProperty("myModel", QVariant::fromValue(dataList));

在上面的示例中,这是在 main.cpp 中完成的,但是,我想在定义模型的类的构造函数中执行此操作。有没有办法在我的类定义中获取上下文?如果不是,设置上下文的最佳做法是什么?

编辑:更多上下文:我正在做一个 QQuickItem 应该绘制一条线。我想用这个模型来保存刻度的属性,即像素位置和字符串标签,因此它不需要可编辑,如果缩放发生变化,所有值都需要更改。然后我想使用带有自定义委托的 ListView 绘制刻度。因此,理想情况下,我想在 QQuickItem 中定义我的模型,然后在 QML 中创建它。

【问题讨论】:

QObejcts 和 ListView 的列表听起来像是对资源的巨大浪费。 我认为我正在听从你的建议 :-) ***.com/questions/49150374/text-in-custom-qquickitem 如果你愿意,我很乐意在聊天中更好地描述它。 文本标签本身不会成为问题,除非您要绘制数百个。错误令人费解,为什么您需要 QObjects 部分。 基本上我想要什么:在我的 c++ QQuickItem 中,我有一个函数,它会给我一个刻度位置列表。然后需要绘制这些。我只是不知道最好的方法是将c++列表放入QML然后绘制它 请注意,在那个链接的问题中,您要创建自己的离散文本元素,这不可能比简单地使用 QML Text 更有效。这与将文本绘制为绘图的一部分而不为每个标签实例化一堆文本元素的说法不同。 【参考方案1】:

有没有办法在我的类定义中获取上下文?

将它作为构造函数参数传递应该可以解决问题;)

但是,我不建议使用这样的对象作为模型。它又快又脏,强调脏。模型更改时效率非常低,因为视图必须重新创建所有内容,而完整的模型只会反映实际更改。

检查this 的实现。

编辑:澄清后,请考虑以下bit of documentation:

某些 C++ 序列类型在 QML 中被透明地支持为 javascript 数组类型。

具体来说,QML 目前支持:

QList<int>
QList<qreal>
QList<bool>
QList<QString> and QStringList
QVector<QString>
std::vector<QString>
QList<QUrl>
QVector<QUrl>
std::vector<QUrl>
QVector<int>
QVector<qreal>
QVector<bool>
std::vector<int>
std::vector<qreal>
std::vector<bool>

所有这些都隐式转换为JS数组,您可以直接将JS数组用作模型数据。

【讨论】:

感谢您的链接,我需要更多时间来了解它。问题是,我在 qml 中创建了对象,所以我不能将它作为构造函数参数传递(我想)。 如果您在 QML 中创建它,则无需将其从 C++ 公开到 QML。只需将其分配给属性或其他任何东西。 对不起,我写的不是很清楚。 dataList 是一个 QList ,我希望它只是我的 QQuickItem (绘图组件)的成员变量。然后在 QML 中创建 QQuickItem。然后我将如何从 QML 访问 dataList?像 plot.dataList 一样简单? 当然,您只需要将无法从 QML 访问的内容暴露给 QML。但同样,这很浪费,考虑到每个空的 QObject 就像 160 字节。 另一个问题:如果我有例如在我的 QQuickItem 派生的 c++ 类中定义的 QList 作为属性,我还需要设置上下文还是自动可用?

以上是关于获取当前上下文以设置对象列表模型的主要内容,如果未能解决你的问题,请参考以下文章

从新的子上下文中删除对象

注入对象列表以播放应用程序上下文

实体类型 [class] 不是当前上下文模型的一部分

如何获取所选列表视图项中的id以打开上下文菜单并通过下一个活动来实现目标。

SharePoint服务器端对象模型 之 访问用户用户组和权限(Part 2)

需要帮助设置后台托管对象上下文。在 FRC controllerDidChangeContent 上获取异常