我可以在基于模型的 QListView 中使用自定义小部件作为视图吗?

Posted

技术标签:

【中文标题】我可以在基于模型的 QListView 中使用自定义小部件作为视图吗?【英文标题】:Can I use a custom widget as a view in a model-based QListView? 【发布时间】:2015-10-12 19:49:29 【问题描述】:

我想使用 Qt5 在可滚动列表中呈现一系列复杂数据。由于数据的来源是时间线,所以我想懒加载——也就是我想利用QAbstractItemModel的特性按需加载数据。视图将是只读的。

我可以使用自定义小部件在列表的每个单元格中显示数据吗?

到目前为止,我已经看到了一些建议:

使用QAbstractItemView->setIndexWidget();但是,因为我想延迟加载数据,所以在加载数据之前为所有索引创建和设置小部件似乎不必要地昂贵。 将QAbstractItemView->setItemDelegate() 与覆盖paint() 的自定义QStyledItemDelegate 一起使用。结果看起来不错,但小部件只是简单地呈现,而不是交互的(无法选择文本等)。

【问题讨论】:

这可以使用 QML 轻松完成,但我不知道 Qt Widgets。看起来其他人之前遇到过这个问题:forum.qt.io/topic/13165/… 【参考方案1】:

您可以使用QGraphicsScene 甚至QScrollArea + 您的自定义小部件来实现。不必到处使用QAbstractItemModel

如果您为每个模型项使用自定义小部件,您可能会遇到性能和交互性问题。

Ofc,你可以写一个自定义的委托,但是具有交互性的委托是非常复杂的话题——需要手动处理鼠标事件,绘制一个选择等等。

【讨论】:

在您的第一个建议中,我必须手动重新实现项目选择,对吗?至于#2,请您详细解释一下吗? 您需要哪些详细信息?如何创建一个新的小部件?或者如何将小部件添加到现有的QScrollArea 您回答说“您可能会遇到性能和交互性问题。”你的意思是什么问题? 我的意思是,用作代理的小部件在某些情况下不会有悬停/按下动画。如果你有很多小部件 - 你可能会有明显的 UI 滞后。很多意味着 100 - 100000,取决于小部件的复杂性。

以上是关于我可以在基于模型的 QListView 中使用自定义小部件作为视图吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 QStyledItemDelegates 作为 QListView 中的自定义项

带有自定义项目的 QListView => 鼠标事件被传播

PyQt5-高级控件使用(QListView)

PyQt5 组件之QListView

QListView 仅在视图中显示单个项目

PyQt5允许在编辑时选择QListView项