4

qtableview使用自定义模型和自定义 sortfilterproxymodel创建一个

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);
}

使用代理模型中的自定义lessThan方法。但是当通过模型data方法检索数据时,只有

  • Qt::DisplayRole
  • Qt::装饰角色
  • 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();
    }
}

所以问题是:为什么在data对代理模型进行排序时,模型的方法永远不会被 Qt::UserRole 调用?

解决方案:

我通过以下方式获得了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);
4

2 回答 2

4

如果您重新实现lessThan,那么您需要自己执行排序。setSortRole 仅影响默认lessThan实现。

于 2013-08-08T11:03:37.380 回答
0

您应该:

称呼

void QSortFilterProxyModel::sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ) [virtual]

在您的视图中设置排序(并单击列)

setSortingEnabled(true); 

设置动态过滤

void QSortFilterProxyModel::setDynamicSortFilter ( bool enable )

编辑:

请注意,在文档中。他们在例子中说:

此时,排序和过滤均未启用;原始数据显示在视图中。通过 QSortFilterProxyModel 所做的任何更改都将应用于原始模型。

您必须触发过滤/排序

于 2013-08-08T10:52:45.307 回答