Qt QML使用中继器和委托,显示旧列表
我使用Repeater和Delegate来显示一个列表,这一切都很好,但是当我清理模型时,GUI没有清理它,仍然显示旧的列表。我将模型从cpp连接器传递到qml。 我尝试了update()、repaint(),但没有效果。 任何线索都会有帮助 Cpp代码: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
void ModelCpp::clearMessage() {
qDeleteAll(messageList);
messageList.clear();
emit messageListUpdated();
}
QML
编辑:
我把范围缩小到QStackedWidget,我使用QStackedWidget加载不同的页面。在一个屏幕上是清晰的,但现在我注意到它正在所有屏幕上发生。除非qml页面不是当前页面,否则它不会更新,并且具有旧值。当页面不是当前页面时,如何在后台重新加载该页面。我解决了这个问题。使用QStackedWidget,仅更新/重新绘制可见页面,而不更新/重新绘制不可见页面。当不可见页面变为可见时,它将被绘制,并且在绘制新值之前,您将短暂地看到旧值。每次创建新的QQuickWidget并将其添加到QStackedWidget。是否已更新
messageList
声明为messageList
属性的NOTIFY
信号?是@JarManQ_属性(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
...
```