未设置QSortFilterProxyModel中的SortRole

时间:2013-08-08 10:25:11

标签: qt qsortfilterproxymodel

我使用自定义模型和自定义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的:: DisplayRole
  • Qt的:: DecorationRole
  • Qt的:: FontRole
  • Qt的:: TextAlignmentRole
  • Qt的:: BackgroundRole
  • Qt的:: ForegroundRole
  • Qt的:: CheckStateRole
  • Qt的:: SizeHintRole

被调用,但不是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);

2 个答案:

答案 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应用于原始模型。

你必须解雇过滤/排序