在 Qt 中使用不同模型访问另一个列表视图的委托中的列表视图模型数据

Posted

技术标签:

【中文标题】在 Qt 中使用不同模型访问另一个列表视图的委托中的列表视图模型数据【英文标题】:Access listview model data in the delegate of another listview with a different model in Qt 【发布时间】:2021-04-20 13:48:25 【问题描述】:

问题: 我在 qml 中有两个列表视图,它们都有基于 QAbstractListModel 用 C++ 实现的模型。

例如,假设两个列表视图只有两个角色,颜色和大小,并且这两个都是动态的,并且可以从一些外部数据输入(即 tcp 客户端)中改变。 第二个列表视图中的每个项目都与第一个项目相关,其中第二个列表视图中的任何元素都将包含第一个列表视图中一个元素的索引。 第二个列表视图不仅要显示它自己的角色,还要显示第一个列表视图中元素的颜色和大小,它有存储的索引。

如何在第二个列表视图中动态更新这个值?

我已经使用了一些 setter 和 getter,并且可以在我第一次实例化第二个 listview 时填充数据,但是之后对第一个 listview 中的属性的任何更改都不会显示在第二个 listview 中,因为这个 listview 没有连接第一个列表中的数据,数据更新时不会更新。

那么更具体的问题是如何将这两者联系起来?最好不要更新整个第二个列表视图,而只更新连接到第一个列表中更改元素的委托。

如果这个文本示例令人困惑,我可以尝试编写一些代码来进一步解释。

【问题讨论】:

这能回答你的问题吗? How to access delegate properties in ListView using index 它并没有真正为我解决它,而且选择的答案在如何实施方面也很模糊。下面的答案有部分答案,因此会进行一些编辑。 【参考方案1】:

我用我在评论中写的内容尝试了上面的答案,使用 itemAtIndex,但这不会在新数据到达时更新第二个列表中的属性。

我通过在第二个列表的委托中创建一个函数来实现这个工作,该函数在第一个列表的 contentItem 的子项中搜索,然后从那里绑定角色,如下所示:

function getDelegateInstanceAt(index) 
                    var len = cameraList.contentItem.children.length;
                    if(len > 0 && index > -1 && index < len) 
                        return cameraList.contentItem.children[index];
                     else 
                        return undefined;
                    
                
property text firstListName: getDelegateInstanceAt(storedFirstListIndex).name

【讨论】:

【参考方案2】:

您的委托可以在 ListView 中访问自己的 index,您可以将其与其他人的 ListView itemAtIndex 函数一起使用。

将您想要的模型数据角色与第一个列表的委托中的属性绑定,并在第二个列表委托中使用它,即

// In the delegate of the first listview, named firstList
property text nameBind: name

// In the delegate of the second listview, where storedIndex is an index of an element in the first listview.
text: firstList.itemAtIndex(storedIndex).nameBind

【讨论】:

在这种情况下,您必须向其中添加一个属性,例如“itemData”,然后可以访问它(model 由于名称冲突而无法使用) 没错,您也可以将该索引与模型本身一起使用 我使用 itemAtIndex 进行了尝试,并且必须为我的每个模型角色添加属性绑定,但它可以通过添加我的第一个列表委托“property bool colorCopy: color”来工作。然后在我的第二个列表委托中使用 firstList.itemAtIndex(storedIndex).colorCopy 访问它。如果您编辑将设置为解决方案(或者如果没有,我可以这样做,基本上是 Amfasis 评论) 实际上将其绑定到第二个列表中的另一个属性不会使其更新新数据,似乎我每次都必须使用 itemAtIndex 调用整个函数。 终于想通了,我有一个我的解决方案的迭代不是这个解决方案。这不起作用,所以我将删除我的编辑并自己回答。

以上是关于在 Qt 中使用不同模型访问另一个列表视图的委托中的列表视图模型数据的主要内容,如果未能解决你的问题,请参考以下文章

26.QT-模型视图之自定义委托

Qt入门教程数据模型篇模型/视图教程

Qt入门教程数据模型篇模型/视图教程

Qt 中具有单个模型的表格和列表视图

第61课 模型视图中的委托(上)

QSlider 和 QSpinBox 之间的 Qt 模型视图架构