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

Qt QML使用中继器和委托,显示旧列表,qt,qml,qt-quick,Qt,Qml,Qt Quick,我使用Repeater和Delegate来显示一个列表,这一切都很好,但是当我清理模型时,GUI没有清理它,仍然显示旧的列表。我将模型从cpp连接器传递到qml。 我尝试了update()、repaint(),但没有效果。 任何线索都会有帮助 Cpp代码: void ModelCpp::clearMessage() { qDeleteAll(messageList); messageList.clear(); emit messageListUpdated(); } Q

我使用Repeater和Delegate来显示一个列表,这一切都很好,但是当我清理模型时,GUI没有清理它,仍然显示旧的列表。我将模型从cpp连接器传递到qml。 我尝试了update()、repaint(),但没有效果。 任何线索都会有帮助

Cpp代码:

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

编辑:


我把范围缩小到QStackedWidget,我使用QStackedWidget加载不同的页面。在一个屏幕上是清晰的,但现在我注意到它正在所有屏幕上发生。除非qml页面不是当前页面,否则它不会更新,并且具有旧值。当页面不是当前页面时,如何在后台重新加载该页面。

我解决了这个问题。使用QStackedWidget,仅更新/重新绘制可见页面,而不更新/重新绘制不可见页面。当不可见页面变为可见时,它将被绘制,并且在绘制新值之前,您将短暂地看到旧值。每次创建新的QQuickWidget并将其添加到QStackedWidget。

是否已更新
messageList
声明为
messageList
属性的
NOTIFY
信号?是@JarMan
Q_属性(QList messageList READ getMessageList NOTIFY messageList changed)
因此您的
NOTIFY
已更改
messageList
,但是您的
clearMessage
函数会发出
messageListUpdated
。那是错别字吗?啊,不,这里是错别字
Q_属性(QList messageList READ getMessageList NOTIFY MessageListUpdate)
如果您没有发出
messageListChanged
,则QML将不知道模型已更改。这听起来不正确。另外,您的问题使用的是QML代码,而不是小部件。你真的把小部件和QML混合在一起了吗?不,QQuickWidget用来显示QML,QStackedWidget用来堆叠不同的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

                                      ...


    ```