在c+中对QStandardItemModel进行排序+;Qt

在c+中对QStandardItemModel进行排序+;Qt,qt,sorting,model,qstandarditemmodel,Qt,Sorting,Model,Qstandarditemmodel,我有一个QStandarItemModel类型的模型,它看起来像这样: QHash<int, QByteArray> roleNames; roleNames[Car2goVehicle::NameRole] = "plate_number"; roleNames[Car2goVehicle::DescriptionRole] = "address"; roleNames[Car2goVehicle::

我有一个QStandarItemModel类型的模型,它看起来像这样:

          QHash<int, QByteArray> roleNames;
          roleNames[Car2goVehicle::NameRole] =  "plate_number";
          roleNames[Car2goVehicle::DescriptionRole] = "address";
          roleNames[Car2goVehicle::FuelRole] = "fuel";
          roleNames[Car2goVehicle::InteriorRole] = "interior";
          roleNames[Car2goVehicle::ExteriorRole] = "exterior";
          roleNames[Car2goVehicle::VinRole] = "vin";
          roleNames[Car2goVehicle::LatRole] = "lat";
          roleNames[Car2goVehicle::LonRole] = "lon";
          roleNames[Car2goVehicle::DistanceRole] = "distance";
          d->m_vehiclesmodel = new RoleItemModel(roleNames);
enum Role {
    NameRole=Qt::UserRole,
    DistanceRole,
    ...
};
但结果是错误的。有人能告诉我怎么分类吗


谢谢。

结果怎么了? 在大多数情况下,不会对模型本身进行排序,而是对视图进行排序。以下是文档中的示例:

QTreeView *treeView = new QTreeView;
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);

proxyModel->setSourceModel(sourceModel);
treeView->setModel(proxyModel);
在上面的示例中,您可能会混淆角色和列。您的角色枚举应如下所示:

          QHash<int, QByteArray> roleNames;
          roleNames[Car2goVehicle::NameRole] =  "plate_number";
          roleNames[Car2goVehicle::DescriptionRole] = "address";
          roleNames[Car2goVehicle::FuelRole] = "fuel";
          roleNames[Car2goVehicle::InteriorRole] = "interior";
          roleNames[Car2goVehicle::ExteriorRole] = "exterior";
          roleNames[Car2goVehicle::VinRole] = "vin";
          roleNames[Car2goVehicle::LatRole] = "lat";
          roleNames[Car2goVehicle::LonRole] = "lon";
          roleNames[Car2goVehicle::DistanceRole] = "distance";
          d->m_vehiclesmodel = new RoleItemModel(roleNames);
enum Role {
    NameRole=Qt::UserRole,
    DistanceRole,
    ...
};
如果要按距离角色排序,请调用:

model->setSortRole( Car2goVehicle::DistanceRole );
然后,按某个列(与角色无关)排序,例如第0列:

model->sort( 0, Qt::AscendingOrder );

如果
QStandardItemModel::sort()
足够强大,我不建议使用
QSortFilterProxyModel
。相反,我坚持使用基本的Qt信号

在这里,我使用的是PyQt,但代码也应该在C++中工作:

self.model = QStandardItemModel()
self.populate_model()
self.model.setHorizontalHeaderLabels(map(str, range(self.model.rowCount())))
self.treeview.setModel(self.model)
self.treeview.header().setSectionsClickable(True)
self.treeview.header().setSortIndicatorShown(True)
self.treeview.header().sortIndicatorChanged.connect(self.model.sort)

请注意,最后一行连接了
QHeaderView::sortinindicator
QStandardItemModel::sort

您甚至可以说,不管您如何排序模型,视图可能会选择以另一种方式显示它。这就是为什么您需要使用
QSortFilterProxyModel
。我也使用过QSortFilterProxyModel,但我的模型是根据Car2goVehicle::NameRole而不是Car2goVehicle::DistanceRoleTermirlan:您是否将列与角色混淆了?我在上面的代码片段中添加了一段。