QML 使用中继器和委托,显示旧列表

Posted

技术标签:

【中文标题】QML 使用中继器和委托,显示旧列表【英文标题】:QML using Repeater and Delegate, old list is shown 【发布时间】:2020-10-02 15:31:59 【问题描述】:

我正在使用Repeater 和Delegate 来显示一个列表,一切正常,但是当我清理模型时,GUI 没有清理它,仍然显示旧列表。我将模型从 cpp 连接器传递给 qml。 我试过更新(),重绘()但无济于事。 任何线索都会有所帮助。

Cpp 代码:

void ModelCpp::clearMessage() 
    qDeleteAll(messageList);
    messageList.clear();
    emit messageListUpdated();

QML

ColumnLayout 

                spacing: 1
                Repeater
                    model: modelCpp.messageList
                    delegate: Rectangle 
                                  visible: true
                                  color: colorBoxShader
                                  Layout.preferredWidth: 100
                                  Layout.preferredHeight: 20

                                  RowLayout
                                      anchors.fill: parent

                                      Text 
                                          text: modelData.label
                                          Layout.alignment: Qt.AlignLeft
                                          Layout.leftMargin: layoutLeftMargin
                                          color: "white"
                                          font.bold: true

                                      ...


    ```

编辑:

我缩小到 QStackedWidget,我正在使用 QStackedWidget 加载不同的页面。在一个屏幕上很清楚,但现在我注意到它在所有屏幕上都发生了。直到 qml 页面不是当前页面,它才会更新并且具有旧值。当页面不是当前页面时,如何在后台重新渲染页面。

【问题讨论】:

是否将messageListUpdated 声明为messageList 属性的NOTIFY 信号? 是的@JarMan Q_PROPERTY(QList<QObject*> messageList READ getMessageList NOTIFY messageListChanged) 所以你的NOTIFYmessageListChanged,但是你的clearMessage 函数发出messageListUpdated。是不是打错字了? 啊不,这里是错字。 Q_PROPERTY(QList<QObject*> messageList READ getMessageList NOTIFY messageListUpdated) 如果你没有发出messageListChanged,那么QML就不会知道模型已经改变了。 【参考方案1】:

我发现了这个问题。使用 QStackedWidget 仅更新/重绘可见页面,而不是不可见页面。当不可见页面变得可见时,它会被绘制,并且在绘制新值之前您会短暂看到旧值。每次新建 QQuickWidget 并添加到 QStackedWidget 中。

【讨论】:

这听起来不对。另外,您的问题使用了 QML 代码,而不是小部件。您真的将小部件与 QML 混合在一起吗? 否,QQuickWidget 用于显示 QML,QStackedWidget 用于堆叠不同的 QML 页面。

以上是关于QML 使用中继器和委托,显示旧列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中获取中继器的委托数据?

qml 使用中继器从 Qlist 绘制折线图

列数可变的 QML 中继器和 QML 网格布局

更改模型后未正确绘制 QML 中继器

具有“填充”过渡的 QML 中继器

QML:如何通过拖放重新排序中继器项目?里面有一些工作代码