【问题标题】:Sort QStandardItemModel in c++ Qt在 c++ Qt 中对 QStandardItemModel 进行排序
【发布时间】:2017-04-23 07:12:52
【问题描述】:

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

但结果是错误的。谁能告诉我如何排序?

谢谢。

【问题讨论】:

    标签: qt sorting model qstandarditemmodel


    【解决方案1】:

    结果有什么问题? 在大多数情况下,使用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 );
    

    【讨论】:

    • 您甚至可以说,不管您如何对模型进行排序,视图可能会选择以另一种方式显示它。这就是为什么你需要使用QSortFilterProxyModel
    • 我也使用了 QSortFilterProxyModel 但我的模型是根据 Car2goVehicle::NameRole 而不是 Car2goVehicle::DistanceRole 排序的
    • Termirlan:您是否将列与角色混淆了?我在上面的代码 sn-p 上添加了一段。
    【解决方案2】:

    如果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::sortIndicatorChangedQStandardItemModel::sort 的最后一行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      相关资源
      最近更新 更多