我正在构建一个基于 QAbstractListModel 和 QListView 的文件浏览器。
如您所知,显示的内容可以通过扩大窗口或滚动来改变。
如何确定实际显示的第一个和最后一个条目(或索引)。我必须自己编程吗?
后来补充:
完整描述见:
http://qt-project.org/forums/viewthread/26497/
提前致谢,
Stef Bon Voorburg 荷兰
我正在构建一个基于 QAbstractListModel 和 QListView 的文件浏览器。
如您所知,显示的内容可以通过扩大窗口或滚动来改变。
如何确定实际显示的第一个和最后一个条目(或索引)。我必须自己编程吗?
后来补充:
完整描述见:
http://qt-project.org/forums/viewthread/26497/
提前致谢,
Stef Bon Voorburg 荷兰
评论中提供的理由不充分;该模型应该随时调用beginInsertRows
/ endInsertRows
,即使您插入项目的范围当前在视图中不可见。这有多种原因(代理模型、QPersistentModelIndex
实例、选择处理、QAbstractItemView
内部管理、已渲染项目的缓存等)。
Qt 中的 MVC API 被设计为模型不应该知道视图当前显示的内容。合约中表达的合约QAbstractItemModel
指定模型“只是”必须通过调用受保护的方法(rowsInserted
除其他外发出 etc 信号)来保持世界其他地方的更新。如果您发现自己开始思考“嘿,如果我知道这个模型在附加视图中是如何显示的就好了”,正确的做法是确保您有效地使用现有的 API。例如,一个非常常见的问题是程序员发现他们的模型的data()
方法被过于频繁地调用,例如,对于列表中的每个项目。造成这种情况的典型原因是相应的QListView
需要知道为每个项目保留多少空间,以便确定滚动条大小。一个正确的方法是要么返回可用的数据SizeHintRole
,要么将视图设置uniformRowSizes
为true
.