我有简单的模型视图树视图,带有 QSortFilterProxyModel 代理对列进行排序,QStandardItemModel 作为模型
在每列中都有字符串可以很好地排序,但在包含数字(作为字符串)的列中排序错误。
说我有 9,12,1(当我对它们进行排序时,每个数字在不同的列中,我得到 1,12,9 或 12,1,9 但从来没有按正确的顺序。像 1,9,12 或 12,9,1为什么?
我还注意到,当我逐列排序时,当我尝试获取新的列文本时, m_model->item(iSelectedRow,0)->text();
我得到了初始列文本,但没有得到新的排序列文本。为什么?
问问题
6465 次
3 回答
13
这是因为默认情况下,QSortFilterProxyModel 按 DisplayRole 排序。如果返回一个字符串,它将对该字符串进行排序。要让模型按其他值排序,请在源模型中定义自定义排序角色并将其设置在代理上:
class MyModel {
...
enum Role {
SortRole=Qt::UserRole
};
QVariant data( ... ) const {
...
switch ( role ) {
case Qt::DisplayRole:
return value as string;
case SortRole:
return value as int;
}
}
};
...
sortfilterproxy->setSortRole( MyModel::SortRole );
您的第二个问题:m_model 是什么?源模型,还是 sortfilterproxymodel?前者永远不会被排序改变,排序只发生在代理中。
于 2011-07-04T08:42:47.053 回答
3
如果对字符串“9”、“12”和“1”进行排序,您将得到“1”、“12”、“9”(字典排序)。如果您希望它们按数字排序,您必须继承 QSortFilterProxyModel 并重新实现 lessThan 成员函数,您可以只使用 QString::toInt()。
您可以通过研究出色的Qt 文档来了解所有这些,您还可以在其中找到有关 mapToSource()、mapFromSource()、mapSelectionToSource() 和 mapSelectionFromSource() 的信息,以将源 QModelIndexes 转换为排序/过滤的模型索引,反之亦然。
于 2011-07-04T08:38:36.263 回答
1
在填写表格时使用 QStandardItem::setData(),如下所示。然后一切都会按预期工作。
Qt 文档中的以下几行
virtual void QStandardItem::setData(const QVariant & value, int role = Qt::UserRole + 1)
这是集合数据的简单用法。
item->setData(intData, Qt::DisplayRole);
于 2013-12-09T11:25:57.873 回答