3

我有一个 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);

现在我想像这样根据距离进行排序

           d->m_vehiclesmodel->setSortRole(Qt::UserRole);
           d->m_vehiclesmodel->sort(Car2goVehicle::DistanceRole, Qt::AscendingOrder);

但结果是错误的。有人可以告诉我如何排序吗?

谢谢。

4

2 回答 2

6

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

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

proxyModel->setSourceModel(sourceModel);
treeView->setModel(proxyModel);

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

enum Role {
    NameRole=Qt::UserRole,
    DistanceRole,
    ...
};

如果要按距离角色排序,请致电:

model->setSortRole( Car2goVehicle::DistanceRole );

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

model->sort( 0, Qt::AscendingOrder );
于 2011-04-20T14:30:23.737 回答
0

QSortFilterProxyModel如果QStandardItemModel::sort()足够强大,我不建议使用。相反,我坚持使用基本的 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::sortIndicatorChangedQStandardItemModel::sort.

于 2017-04-22T23:12:52.483 回答