【问题标题】:Qml component recursivelyQml 组件递归
【发布时间】:2015-11-07 06:09:25
【问题描述】:

有没有办法递归地创建 QML 组件?我正在实现一个聊天,用户可以在其中向另一个用户重新发送消息,因此我希望看到包含另一条消息的消息组件。像这样:

>my message
>>forwarded message1
>>>forwarded message1.2
>>forwarded message2

但我不知道此类转发消息的最大深度,因此我不能只为每种情况创建原型。 现在我使用Loader组件递归加载组件,但有2个错误。首先,它非常慢,所以如果我在聊天中有 100 条消息并且转发了很多消息,加载页面最多需要 2 秒。 其次,滚动条的行为很奇怪 - Loader 组件(据我所知)在隐藏时卸载我的组件,所以当我滚动整体时 height 会发生变化。 也许有人知道递归创建项目的好方法,或者关于如何使这部分代码工作得更快并且没有滚动错误的一些想法? 到目前为止,我只有一个想法 - 将该组件移动到 C++ 代码中,这样我就可以在没有 Loader 组件的情况下创建项目。

【问题讨论】:

  • 请向您展示我们可以帮助您的代码。

标签: javascript qt qml qtquick2


【解决方案1】:

尽管 sn-p 会有所帮助,但如果我理解正确的话,您正在尝试按需动态创建对象,因为您不知道需要多少对象。

Here 文档链接。 您可以通过 Qt.createComponentComponent.createObject 方法来做到这一点。

它遵循从上面链接的文档中复制的示例:

var component = Qt.createComponent("Button.qml");
if (component.status == Component.Ready) {
    component.createObject(parent, {"x": 100, "y": 100});
}

无论如何都不要依赖上面的代码。我强烈建议阅读文档,因为示例真的很简单。

无论如何,如果我必须做类似的事情,我不会通过上述功能重复生成对象。性能和内存占用都可能因此受到影响。相反,请尝试从更合适且众所周知的数据结构(如 循环缓冲区)中获得最佳效果:您可以预先分配它们,让您的代码易于理解和维护,并降低运行时的风险。

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 2016-07-02
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2011-10-21
    • 2011-11-18
    • 2018-07-23
    相关资源
    最近更新 更多