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

Tem*_*lan 3 sorting qt model qstandarditemmodel

我有一个类型为QStandardItemModel的模型,如下所示:

          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);
Run Code Online (Sandbox Code Playgroud)

现在我想按照这样的距离排序

           d->m_vehiclesmodel->setSortRole(Qt::UserRole);
           d->m_vehiclesmodel->sort(Car2goVehicle::DistanceRole, Qt::AscendingOrder);
Run Code Online (Sandbox Code Playgroud)

但结果是错误的.有人能告诉我如何排序吗?

谢谢.

Fra*_*eld 6

结果出了什么问题?在大多数情况下,不使用QSortFilterProxyModel对模型本身进行排序,而是对视图进行排序.以下是文档中的示例:

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

proxyModel->setSourceModel(sourceModel);
treeView->setModel(proxyModel);
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您可能会混淆角色和列.您的角色枚举应如下所示:

enum Role {
    NameRole=Qt::UserRole,
    DistanceRole,
    ...
};
Run Code Online (Sandbox Code Playgroud)

如果要按距离角色排序,请调用:

model->setSortRole( Car2goVehicle::DistanceRole );
Run Code Online (Sandbox Code Playgroud)

然后,按某个列排序(与角色无关),例如第0列:

model->sort( 0, Qt::AscendingOrder );
Run Code Online (Sandbox Code Playgroud)