Model/View Qt文档中关于排序的描述可能有误?
The description about sorting in Model/View Qt document maybe wrong?
在Qt在线文档Model/View编程中,据说如果你的模型是可排序的,即如果它重新实现了QAbstractItemModel::sort()
函数,QTableView
和QTreeView
提供一个 API 允许您以编程方式对模型数据进行排序。此外,您可以启用交互式排序(即允许用户通过单击视图的 headers 对数据进行排序),方法是将 QHeaderView::sortIndicatorChanged() signal
连接到 QTableView::sortByColumn() slot
或 QTreeView::sortByColumn() slot
, 分别。
但是,首先 QTableView::sortByColumn()
不是插槽,因此不能将信号连接到它;其次,QTableView::sortByColumn()
的代码类似于
d->header->setSortIndicator(column, order);
//If sorting is not enabled, force to sort now.
if (!d->sortingEnabled)
d->model->sort(column, order);
和 QHeaderView::setSortIndicator()
函数发出 sortIndicatorChanged(logicalIndex, order)
。但是如果使用函数 setSortingEnabled(true)
,信号 sortIndicatorChanged(logicalIndex, order)
也可以在单击视图的 header 列时由视图 header 自动发出。
所以也许正确的方法是制作一个插槽来接收信号sortIndicatorChanged(logicalIndex, order)
,并在插槽中调用模型的覆盖虚函数sort()
?
通过单击列对树视图进行排序。
设置视图可以通过点击"header"排序。
treeView_->setSortingEnabled(true);
将 header 信号连接到您创建的插槽。
connect(headerView, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
treeModel_, SLOT(sortByColumn(int, Qt::SortOrder)));
槽中,调用模型的sort()
虚函数。 sort()
virtual function是QAbstractItemModel的一个虚函数,应该覆盖它。
void TreeModel::sortByColumn(int column, Qt::SortOrder order)
{
sort(column, order);
}
重写 sort()
函数,就像您的模型应该做的那样。
emit dataChanged(QModelIndex(), QModelIndex());
从一个模型更新整个树视图。
在Qt在线文档Model/View编程中,据说如果你的模型是可排序的,即如果它重新实现了QAbstractItemModel::sort()
函数,QTableView
和QTreeView
提供一个 API 允许您以编程方式对模型数据进行排序。此外,您可以启用交互式排序(即允许用户通过单击视图的 headers 对数据进行排序),方法是将 QHeaderView::sortIndicatorChanged() signal
连接到 QTableView::sortByColumn() slot
或 QTreeView::sortByColumn() slot
, 分别。
但是,首先 QTableView::sortByColumn()
不是插槽,因此不能将信号连接到它;其次,QTableView::sortByColumn()
的代码类似于
d->header->setSortIndicator(column, order);
//If sorting is not enabled, force to sort now.
if (!d->sortingEnabled)
d->model->sort(column, order);
和 QHeaderView::setSortIndicator()
函数发出 sortIndicatorChanged(logicalIndex, order)
。但是如果使用函数 setSortingEnabled(true)
,信号 sortIndicatorChanged(logicalIndex, order)
也可以在单击视图的 header 列时由视图 header 自动发出。
所以也许正确的方法是制作一个插槽来接收信号sortIndicatorChanged(logicalIndex, order)
,并在插槽中调用模型的覆盖虚函数sort()
?
通过单击列对树视图进行排序。
设置视图可以通过点击"header"排序。
treeView_->setSortingEnabled(true);
将 header 信号连接到您创建的插槽。
connect(headerView, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), treeModel_, SLOT(sortByColumn(int, Qt::SortOrder)));
槽中,调用模型的
sort()
虚函数。sort()
virtual function是QAbstractItemModel的一个虚函数,应该覆盖它。void TreeModel::sortByColumn(int column, Qt::SortOrder order) { sort(column, order); }
重写
sort()
函数,就像您的模型应该做的那样。emit dataChanged(QModelIndex(), QModelIndex());
从一个模型更新整个树视图。