我创建了一个带有自定义模型和自定义 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);
}

在代理模型中使用自定义 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();
        }
    }
    

    所以问题是:为什么在对proxymodel进行排序时,模型的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);
    

    最佳答案

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

    关于qt - 未设置 QSortFilterProxyModel 中的 SortRole,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18123620/

    10-12 04:06
    查看更多