2011-04-20 40 views
2

我有型QStandardItemModel的模型,看起來像這樣:排序QStandardItemModel在C++的Qt

  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

結果有什麼問題? 在大多數情況下,不使用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

您甚至可以說,無論您如何對模型進行排序,視圖可能會選擇以其他方式顯示它。這就是爲什麼你需要使用'QSortFilterProxyModel'。 – RedX 2011-04-20 14:33:00

+0

我也使用過QSortFilterProxyModel,但我的模型根據Car2goVehicle :: NameRole排序,而不是Car2goVehicle :: DistanceRole – Temirlan 2011-04-21 13:16:32

+0

Termirlan:您是否將角色與列混淆?我在上面的代碼片段中添加了一段。 – 2011-04-21 15:25:44

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) 

通知的最後一行與QStandardItemModel::sort連接。