我使用自定义模型和自定义sortfilterproxymodel创建qtableview
IssueTableModel *issueModel = new IssueTableModel(this->_repository->getIssueList());
IssueTableSortFilterProxyModel *proxyModel = new IssueTableSortFilterProxyModel(this);
proxyModel->setSourceModel(issueModel);
this->_ui->issuesTable->setModel(proxyModel);
并在sortfilterproxymodel构造函数中:
IssueTableSortFilterProxyModel::IssueTableSortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
{
this->setSortRole(Qt::UserRole);
this->setFilterRole(Qt::UserRole);
}
在proxymodel中使用自定义lessThan
方法。但是当通过模型data
方法检索数据时,只有
被调用,但不是Qt :: UserRole,我需要为模型项输出正确的排序数据:
QVariant IssueTableModel::data(const QModelIndex &index, int role) const
switch (role) {
case Qt::DecorationRole:
// Display icons
switch (index.column()) {
[...]
}
case Qt::DisplayRole:
// Display text data
switch (index.column()) {
[...]
}
case Qt::UserRole:
qDebug() << "USER ROLE!!!!";
// Return data for sorting/filtering
switch (index.column()) {
[...]
}
default:
return QVariant();
}
}
所以问题是:为什么在排序代理模型时,Qt :: UserRole永远不会调用模型的data
方法?
解决方案:
我通过以下方法获取lessThan
方法中的数据:
bool IssueTableSortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
QVariant leftData = sourceModel()->data(left);
QVariant rightData = sourceModel()->data(right);
switch (leftData.type()) {
case QVariant::Int:
return leftData.toInt() < rightData.toInt();
case QVariant::String:
return leftData.toString() < rightData.toString();
case QVariant::DateTime:
return leftData.toDateTime() < rightData.toDateTime();
default:
return false;
}
}
但没有设置指定角色的data
方法的第二个参数......
QVariant leftData = sourceModel()->data(left, Qt::UserRole);
答案 0 :(得分:4)
如果您重新实现lessThan
,那么您需要自己执行排序。 setSortRole仅影响默认的lessThan
实现。
答案 1 :(得分:0)
你应该:
致电
void QSortFilterProxyModel::sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ) [virtual]
在您的视图中设置排序(并点击列)
setSortingEnabled(true);
设置动态过滤
void QSortFilterProxyModel::setDynamicSortFilter ( bool enable )
编辑:
请注意,在docs中。他们在example中说:
此时,既未启用排序也未启用过滤;原本的 数据显示在视图中。通过改变做出的任何改变 QSortFilterProxyModel应用于原始模型。
你必须解雇过滤/排序