qt - 如何对 qstandarditemmodel 进行永久排序

Posted

技术标签:

【中文标题】qt - 如何对 qstandarditemmodel 进行永久排序【英文标题】:qt - how to permanently sort a qstandarditemmodel 【发布时间】:2017-09-08 21:54:12 【问题描述】:

我有一个程序,我试图在表格视图中显示的 qstandarditemmodel 上实现排序。但是,我使用的方法似乎并没有真正对模型本身进行排序,而只是对视图进行排序。我需要它能够对源模型进行排序,因为我使用委托将数据从模型传递到类的对象中并将数据保存到 .csv 文件中,并且如果视图是唯一对其进行排序的事物由于视图中项目的位置发生了变化,但模型本身没有发生变化,导致数据丢失。

这是我在 mainwidget 构造函数中使用的代码,用于将 headerview 点击信号连接到对模型进行排序的方法:

currentStudentsModel = new QStandardItemModel(this);

ui->currentTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->currentTableView->setModel(currentStudentsModel);

ui->currentTableView->setItemDelegate(currentStudentsDelegate);
currentTableHeader = ui->currentTableView->horizontalHeader();
connect(currentTableHeader, SIGNAL(sectionClicked(int)), this, SLOT(on_sectionClicked(int)));

这里是on_sectionClicked():

void mainWidget::on_sectionClicked(int index)

   currentStudentsModel->sort(index,Qt::AscendingOrder);

正如我之前所说,这似乎只对视图中的项目进行排序,因为当我尝试输出存储在模型中的所有记录时,它与最初输入时没有改变。如何让模型自行排序并保存该顺序?

【问题讨论】:

如何将数据写入.cvs 文件?您是直接从currentStudentsModel 写入这些数据,还是使用您用来填充currentStudentsModel 的其他数据结构? @MarekR 我从currentStudentsModel 获取数据并将其传递给一个名为CurrentStudent 的类的对象,该对象具有对应于模型不同列的数据成员,即来自第一列被传递到currentStudents[row].setFirstName(),第二列是姓氏,等等。然后我有一个函数可以将向量中每个学生对象的所有数据写入 .cvs 格式。 所以我猜你在排序之前创建currentStudents,并在模型排序后将currentStudents写入.csv文件,所以你正在将未排序的数据写入文件。保存前更新currentStudents(以便排序)或重写保存代码以直接保存来自QStandardItemModel的数据。另一种“专业”方法是放弃QStandardItemModel 并实现自己的版本QAbstractTableModel,但这对你来说很难。 @MarekR 是的,我意识到前几天我没有更新 currentStudents 向量,这就是它没有排序的原因,我将完全放弃将其用作类并直接编写从您建议的模型中。感谢您的帮助 【参考方案1】:

QStandardItemModel 不实现排序。

来自 Qt 文档:

void QAbstractItemModel::sort(int column, Qt::SortOrder order = Qt::AscendingOrder)

按给定顺序按列对模型进行排序。基类 实现什么都不做。


需要通过QSortFilterProxyModel进行排序

currentStudentsProxyModel = new QSortFilterProxyModel;
currentStudentsModel->setSourceModel( currentStudentsProxyModel );
currentStudentsProxyModel->sort( 0, Qt::AscendingOrder );

void mainWidget::on_sectionClicked(int index)

    currentStudentsProxyModel->sort(index,Qt::AscendingOrder);

【讨论】:

他使用了QStandardItemModel,它实现了sort。 ***.com/questions/5731050/… 注意他写道:However, the method I am using doesn't seem to actually sort the model itself, *but only the view*.

以上是关于qt - 如何对 qstandarditemmodel 进行永久排序的主要内容,如果未能解决你的问题,请参考以下文章

qt - 如何对 qstandarditemmodel 进行永久排序

Qt:如何在模型/视图设置中同步对来自多个线程的数据的访问?

在 Qt 中如何对 QModelIndex 的直接子索引进行排序

QT不同平台对线程如何支持和实现

qt中如何创建2个窗口,点击窗口a上按钮打开窗口b,在b关闭前无法对a操作

Qt例子,线程间通信,如何在线程外部对线程进行控制,问题请看问题补充,多谢了先