如何在 Qt4 中将项目添加到模型并获取新添加项目的索引
Posted
技术标签:
【中文标题】如何在 Qt4 中将项目添加到模型并获取新添加项目的索引【英文标题】:How to add an item to a model in Qt4 and get an index for the newly aded item 【发布时间】:2012-03-05 19:39:11 【问题描述】:我有一个窗口,其中包含 QAbstractTableModel 子类上的 QTreeView (databaseTreeView
)(通过 QSortFilterProxyModel)。
我有一个调用ui->databaseTreeView->model()->insertRow(ui->databaseTreeView->model()->rowCount());
的[添加] 按钮。
我还有一个 [Edit] 按钮,它使用 ui->databaseTreeView->selectionModel()->currentIndex();
将索引传递给编辑器窗口。
我想让 [Add] 按钮自动打开一个带有新创建项目索引的编辑器,但是由于模型已排序,我无法使用插入行的行号。另外insertRows()
只返回一个布尔值(索引对于我的情况会更方便,所以我想知道是否有人可以告诉我如何获取新添加项目的索引)。
我愿意花两三个小时来完成它,如果没有其他选择,我会进行重构,但我认为它应该相当简单。我好奇地查看QAbstractItemModel::rowsInserted
信号,但这只是返回我给insertRows()
的行,并编辑列表中的最后一项,不管它是否是刚刚添加的项。
完整的源代码可以在https://github.com/megamasha/FlashKard 找到,任何人都可以仔细查看。
【问题讨论】:
【参考方案1】:http://doc.qt.nokia.com/4.7/qsortfilterproxymodel.html#details 和 QSortFilterProxyModel 充当原始模型的包装器。 “如果您需要将源 QModelIndexes 转换为排序/过滤模型索引或反之亦然,请使用 mapToSource()、mapFromSource()、mapSelectionToSource() 和 mapSelectionFromSource()。”
【讨论】:
感谢您的报价,但这不是从一个索引转换到另一个索引的问题 - 而是首先没有索引的问题。无论如何,我已经找到了解决方案。我实现了自己的信号,从addRows()
函数发送并将其连接到一个插槽,从而打开该卡进行编辑。【参考方案2】:
好吧,看来我设法回答了我自己的问题 - 我将自己的信号添加到模型类,并从 addRows()
函数发送。然后我将它连接到相应窗口中的一个插槽,以便它可以创建一个编辑器作为其子级。
我仍然很想听听那些感觉不像是笨拙的解决方法的建议 - 我觉得我应该能够使用预先存在的插槽来实现相同的目标。
我会看看mapToSource()
是否有用...
【讨论】:
以上是关于如何在 Qt4 中将项目添加到模型并获取新添加项目的索引的主要内容,如果未能解决你的问题,请参考以下文章
获取NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:在同一解决方案中将公共代码移动到公共项目后,“未映射空缺”
在 IntelliJ IDEA 中将外部库添加到工件 jar
如何在 Visual C++ 2008 中将 MFC 应用程序项目添加到 Win32 应用程序项目
如何在 vscode 中将 `System.Web.Extensions` 程序集添加到 .net 核心项目
如何在 Microsoft Visual Studio Express 2012 for Web 中将文件夹添加到项目中?