我实施了自定义QAbstractTableModel
,我使用std::vector
作为我的数据对象。
现在我想实现sort()方法,让我的表按列排序。 这基本上就是我做的事情:
void SBStateTableModel::sort (int column, Qt::SortOrder order)
{
emit layoutAboutToBeChanged();
switch (column)
{
case Address:
if (order == Qt::DescendingOrder)
std::sort(states.begin(), states.end(), addr_comp_desc);
else
std::sort(states.begin(), states.end(), addr_comp_asc);
default:
return;
}
emit layoutChanged();
}
但仅发出layoutChanged()
并不会重绘视图。标记行并循环显示行时,它们会在突出显示时更新。
该文档还谈到了更新持久性索引。这里的一些人建议,这实际上没有必要。
我甚至不确定如何去做。使用persistentIndexList()
获取列表然后我必须对其进行排序。但是std::sort
不是一个稳定的类型。我不确定如何将持久性指数与我的矢量指数相匹配。
编辑: 只有一个"休息"错过了'案例'!因此函数将在发出layoutChanged信号之前返回。
答案 0 :(得分:3)
D'哦!
我准备深入研究Qt源代码。但是当我单步执行我的代码时,我看到光标跳转到'default'情况下的return语句。
我刚忘记在我的开关盒中添加“休息”!这只是一个简单的堕落错误:(( 现在使用“layoutChanged”完全正常。
答案 1 :(得分:1)
我刚刚这样做了。首先,您必须将标头信号连接到您创建的排序方法。这是一个Python示例,因此您需要将其调整为C ++:
model = SBStateTableModel()
table = QtGui.QTableView()
table.setModel(model)
table.setSortingEnabled(True)
排序时,整个视图将发生变化 - 或者至少大部分视图都会发生变化。因此,发出modelReset
信号将导致视图发生变化。模型重置是要调用的效率最低的信号之一,因为它会导致整个视图被重绘。但是,大多数视图无论如何都会改变。
emit modelReset();
您还可以发出dataChanged
信号,表示所有数据都已更改。 dataChanged
信号可能更快。
self.dataChanged.emit(self.index(0, 0), self.index(self.rowCount()-1, self.columnCount()-1))
(在QTableView的子类中发出dataChanged信号)
auto m = model();
emit dataChanged (m->index(0, 0), m->index(m->rowCount()-1, m->columnCount()-1));