一个 QStandardItemModel 用于不同的 QTableView、通用视图和特定视图

Posted

技术标签:

【中文标题】一个 QStandardItemModel 用于不同的 QTableView、通用视图和特定视图【英文标题】:One QStandardItemModel for different QTableView, Generic vs Specific Views 【发布时间】:2010-08-30 20:04:11 【问题描述】:

我真的不知道这是否有意义,但这就是我想要做的:

我在 QT 中做我的游戏编辑器。目前我正在使用 QStandardItemModel 来存储我的所有场景项目。这些项目有名称、位置、纹理(自定义类的纹理向量)、动画(动画向量)等。

我发现将一个项目用于行很有用,因为除了将它们放在一个地方之外,我可以轻松添加或删除这些项目,因此更改此模型会影响整个应用程序。

现在,我正在尝试为某个项目的“纹理”做特定的视图。这个 QTableView 应该显示纹理的名称、路径等。那么,基本上我怎样才能在通用模型中抓取纹理的向量并填充另一个视图而不做另一个模型?

【问题讨论】:

【参考方案1】:

您将需要使用 QSortFilterProxy 模型。像这样设置一个。

QTableView *tableView = new QTableView;
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);

proxyModel->setSourceModel(sourceModel);
proxyModel->setFilterKeyColumn(column_#_to_filter_by);
proxyModel->setFilterRegExp(a_regex_that_matches_the_item_you_want_to_display);
tableView->setModel(proxyModel);

您应该能够使用一种模型和不同的代理来设置不同的视图。

【讨论】:

感谢您的代码,它现在看起来很清晰,正是我想要的。但我还有另一个问题,如果我想获取特定列以获取另一个视图怎么办。假设您有一个人模型,其中包含姓名、姓氏、年龄、性别。而且您不希望只有姓名和姓氏的视图。该代理看起来像是只假装一列。 在这种情况下,您只需在模型上设置一个视图,对于您不感兴趣的每一列,调用 setColumnHidden(column_num, true)。 我也找到了另一个解决方案。可以对 QSortFilterProxyModel 进行子类化并覆盖 filterAcceptsColumn 方法,您希望在该方法中将 false 返回到您不想显示的列。再次感谢。

以上是关于一个 QStandardItemModel 用于不同的 QTableView、通用视图和特定视图的主要内容,如果未能解决你的问题,请参考以下文章

Qt入门教程数据模型篇 QStandardItemModel标准项目模型

Qt入门教程数据模型篇 QStandardItemModel标准项目模型

QStandardItemModel

来自 C++ 的 QStandardItemModel 在 QtQuick / QML TableView 中不可见

关于QStandardItemModel

拖放到 QTreeView 中的 QStandardItemModel 不起作用