问题标签 [qqmllistproperty]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - QQmlListProperty - 可写 QList 违反 QML 的内存管理规则?
我一直在使用QQmlListProperty
一种“主类”,它既是模型又是 qml 列表属性,允许对象主干的简单声明性标记,它可能与运行时一样可修改,也可能不可修改从动态结构生成/合并代码。我在这个答案中分享了一些近似的东西。
我对实际的实现细节一无所知,但触发我的“蜘蛛感”的是以下文档:
QQmlListProperty::QQmlListProperty(QObject *object, QList<T *> &list)
- 我目前正在使用的状态是:
通常,此构造函数不应在生产代码中使用,因为可写 QList 违反了 QML 的内存管理规则。
我实现的原因QQmlListProperty
是我想使用 qtquick 解析器/工厂或任何能够从常规 QML 代码创建模型数据的东西。当然,API 本身缺少插入和删除方法QQmlListProperty
并不值得担心,因为预期目的不需要此类功能,即在执行过程中解析代码和创建对象,这样附加就足够了。我担心的原因是“可写 QList 违反了 QML 的内存管理规则”,因为最终结果稍后会被修改。并不是说追加也不符合写作的条件,但我仍然担心“违反 QML 的内存管理规则”可能产生的负面影响。
在一般情况下,似乎可以对通过解析 QML 文件创建的结构进行运行时更改并且没有问题,即使它具有 id,例如:
但是在某些情况下,它确实说该对象不能被动态销毁或类似的东西。
QQmlListProperty
那么,鉴于模糊的“可写 QList 违反 QML 的内存管理规则”警告,我是否可以安全地通过稍后实施和更改这些结构来从 QML 文件创建对象结构?
c++ - 如何将枚举的 Qlist 从 C++ 公开到 QML?
我有一个 c++ 错误列表,我想将它公开给 QML。枚举是使用注册的Q_ENUM
,属性是使用注册的Q_PROPERTY
。您可以在下面查看详细信息:
我MyClass
使用以下行注册main.cpp
:
在 QML 中,我使用了该类:
输出是:
问题是什么?!
如何将我的枚举列表公开给 qml?
对于QQmlListProperty
文档说:
注意:QQmlListProperty 只能用于 QObject 派生对象指针的列表。
qt - 如何从 QML 检测 dataChanged() 和 resourcesChanged()
下面的代码:
分别抛出Cannot assign to non-existent property "onDataChanged"
和Cannot assign to non-existent property "onResourcesChanged"
。
信号不是这种情况childrenChanged()
。这样做的原因是,在 中qtdeclarative/src/quick/items/qquickitem.h
,children
属性声明为:
但这不是data
or的情况resources
。它们被声明为:
没有changed()
信号。为什么这种设计选择是为了特别隐藏对不可见儿童所做的更改?此外,如何data
从 QML 中检测到变化?
c++ - QQmlListProperty 异常崩溃,所有权转移到 JavaScript
我在使用 Qt5(5.8,Arch Linux)和 QML 时遇到了一些严重的鼻恶魔。基本上,代码公开了一个 QQmlListProperty,它的成员是动态创建的,并将它们的所有权转移给 JavaScript。当 itemChanged() 信号被发出数千次(在我的实际代码中仅几次就足够了)程序段错误时。
根据 Valgrind + GDB,看起来“A”被 QObject::event 释放,然后被 QML 读取,导致段错误。
奇怪的是,即使将变量“游戏”的名称更改为其他名称,也会改变我必须单击按钮以使程序崩溃的次数。删除转发器或矩形或使用不同的矩形颜色表达式会影响程序是否崩溃。另外,只要不将所有权转移给 JS,就完全没有问题。可悲的是,这也会导致内存泄漏,因为没有任何东西可以释放“A”对象。
由于这些细节,我相信代码中的某处存在未定义的行为,但我不知道在哪里。
这是我可以创建的最短示例:
主.cpp:
main.qml:
这种行为的原因是什么?您碰巧知道解决方法吗?难道 QQmlListProperty 在某种程度上与 JavaScript 所有权不兼容?
编辑:我找到了一个对我来说足够好的解决方法。改变
进入
并在 change() 中发出 listChanged() 以及 itemChanged() 修复它。通过额外的测试,我注意到 Qt 只从 list() 调用索引 lambda 一次,然后释放返回的 'A' -object。它不再调用 lambda 并且似乎试图重用已经释放的“A”。
但是,我仍然很想知道是什么首先导致了这种情况。
c++ - 如何在 QQmlListProperty 属性中正确通知?
每当我Q_PROPERTY
在 Qml 中创建一个供以后使用时,我总是创建一个通知信号来告诉 qml 数据已更改并且需要重新评估。
现在有了一个Q_PROPERTY
类型QQmlListProperty<T>
,我怎么能表示一个项目已被修改、添加或删除?
这甚至可能吗?
c++ - QQmlListProperty: 为什么下面的 getter 函数会起作用?
我是 qml 的新手,很难理解使用 QQmlListProperty 的示例代码:
我不理解 chartitem.cpp 文件中的这个 getter 函数(没有引用 chartitem.h 文件中的私有 m_bars):
将返回哪些数据?没有对private Qlist<BarItem*> m_bars
应该包含返回数据的引用。
以下是头文件和实现文件的重要代码片段...
有人可以解释我的推理错误吗?先感谢您。
c++ - 向 QML 公开来自 C++ 的串行端口名称
我正在尝试通过Q_INVOKABLE QStringList availablePorts()
我在课堂上直接公开给 QML 的类中的函数公开 QSerialPort.available() main
。
主要的:
串行端口管理器
这对于 QML 中的类型无效,model
因为它会引发Unable to assign QStringList to QQmlListModel*
错误。
QML
那么我该如何解决呢?
qt - 如何将 X 和 Y 转换值应用于 C++ 端的 QQuickItem
我有以下QML Rectangle
具有父项的内容。需要注意的最重要的事情是它应用了一个Translate QML 元素,我正在努力理解它究竟对 QML 项及其应用的子项做了什么。
代码:
rect_parent
transform: Translate
如您在上面的代码中所见,有一个属性。以下是应用于它的 XY 平移
在我的代码的 C++ 部分中,我通过以下方式main.cpp
获取QQuickItem
s 。
是的,我可以通过以下方式获得x
and y
。rectQuickItem
问题:
但是我如何得到rectQuickItem
翻译的 x 和 y?
我发现这并不是 UI 上实际应用的 x 和 y item_x
。item_y
这似乎transform: Translate
是向 x 和 y 添加了一些rect
我在查询时没有得到的单位rectQuickItem->x()
。
用更简单的话来说,我需要-20
and-30
应用于 x 和 ytransform: Translate
块中rect_parent
,最终适用于rect
目标:
我正在更改父级rectQuickItem
以将其显示在另一个窗口上,其 x 和 y 位置与原始父级相同。我需要添加到属性的单位x
和y
属性,rectQuickItem
以便在视觉上与前一个父级相同的位置transform: Translate
显示。rect
附加问题:
QQuickItem ::MapToItem会以任何方式帮助我吗?
qt - 我们可以使用 PathView 获得 SwipeView 吗?
在 QML 中,滑动视图不是双向的。所以我需要一个滑动视图代码示例对我非常有益。我只需要在我的视图中保留 3 个项目,并且一次只有项目应该是可见的,并且在以左右任一方式滑动视图时,元素应该位于中心。
c++ - QML QQmlPropertyList - 包含对象生命周期和“内存规则”
我发现很难确认插入到 QQmlPropertyList 中的项目的对象所有权规则,当它被设置为 C++ 中定义的 QML 组件的一部分时
DTech 在:QQmlListProperty - 可写 QList 违反 QML 的内存管理规则?,但他担心删除 QML 中定义的组件的后果。我更担心一般插入到列表中的对象的生命周期要求。
现在据我了解:
如果孩子是从 QML 创建和插入的,他们的父母将被自动设置,并且对象由 QmlEngine 管理。(父级应该已经在附加上定义)
如果我从 C++ 端插入一些东西,我需要自己管理生命周期。(父级在追加时为 nullptr)
QT 文档警告不要“违反 QML 的内存管理规则”。在 http://doc.qt.io/qt-5/qqmllistproperty.html但我找不到任何以清晰、简洁的方式实际说明这些内容的内容。
目前我已经实现了一个非常类似于 http://doc.qt.io/qt-5/qtqml-referenceexamples-properties-example.html的向量的包装器
但是我添加了两条规则:
- 附加检查以查看要添加的对象是否具有nullptr 父级,如果有,则获取所有权。
- 清除当前列表父对象是否拥有任何对象时,对对象执行“deleteLater”并将其父对象设置为nullptr
我假设因为我们在添加具有nullptr父对象的对象时设置了父对象,所以当父对象超出范围时,QT 将自动删除拥有的QObjects 。
是否还有更多我遗漏并需要注意的 规则?
我的实现代码以防万一以上需要一些澄清:
};