排序QtTableModel - QTableView没有更新

时间:2013-12-09 13:08:29

标签: c++ qt sorting model-view

我实施了自定义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信号之前返回。

2 个答案:

答案 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信号可能更快。

的Python:

self.dataChanged.emit(self.index(0, 0), self.index(self.rowCount()-1, self.columnCount()-1))

C ++:

(在QTableView的子类中发出dataChanged信号)

auto m = model();
emit dataChanged (m->index(0, 0), m->index(m->rowCount()-1, m->columnCount()-1));