如何在Qt4中向模型添加项目并获取新增项目的索引

时间:2012-03-05 19:39:11

标签: qt4 qtableview qabstracttablemodel

我有一个窗口,其中包含QAbstractTableModel子类上的QTreeView(databaseTreeView)(通过QSortFilterProxyModel)。 我有一个[添加]按钮,调用ui->databaseTreeView->model()->insertRow(ui->databaseTreeView->model()->rowCount());。 我还有一个[Edit]按钮,它使用ui->databaseTreeView->selectionModel()->currentIndex();将索引传递给编辑器窗口。

我想让[Add]按钮自动打开一个带有新创建项目索引的编辑器,但是在模型排序时,我不能使用插入行的行号。加insertRows()只返回一个bool(索引对我的情况会更方便,所以我想知道是否有人可以告诉我如何获取新添加项目的索引)。

我愿意投入两三个小时,重构如果别无选择,但我认为它应该相当简单。我好奇地看着QAbstractItemModel::rowsInserted信号,但这只返回我给出的行insertRows(),并编辑了列表中的最后一项,无论它是否是刚添加的项目。

可以在https://github.com/megamasha/FlashKard找到完整的来源,供所有人仔细查看。

2 个答案:

答案 0 :(得分:0)

http://doc.qt.nokia.com/4.7/qsortfilterproxymodel.html#details QSortFilterProxyModel充当原始模型的包装器。 “如果您需要将源QModelIndexes转换为已排序/已过滤的模型索引,反之亦然,请使用mapToSource(),mapFromSource(),mapSelectionToSource()和mapSelectionFromSource()。

答案 1 :(得分:0)

好吧,似乎我设法回答了我自己的问题 - 我将自己的信号添加到模型类,并从addRows()函数发送。然后我将它连接到相应窗口中的一个插槽,因此它可以创建一个编辑器作为其子节点。

我仍然有兴趣听到一些感觉不像是一个kludgey解决方案的建议 - 我觉得我应该能够使用预先存在的插槽来实现相同的目标。

我会看看mapToSource()是否可以使用......