Сортировка QStandardItemModel в c ++ Qt - PullRequest
3 голосов
/ 20 апреля 2011

У меня есть модель типа 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);

Но результат неверный.Может кто-нибудь сказать мне, как сортировать?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 20 апреля 2011

Что не так с результатом? В большинстве случаев сортируется не сама модель, а представление, используя 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 );
0 голосов
/ 23 апреля 2017

Я бы не рекомендовал использовать 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::sortIndicatorChanged с QStandardItemModel::sort.

...