【问题标题】:qt - how to permanently sort a qstandarditemmodelqt - 如何对 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 向量,这就是它没有排序的原因,我将完全放弃将其用作类并直接编写从您建议的模型中。感谢您的帮助

标签: c++ qt sorting qtableview qstandarditemmodel


【解决方案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);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多