создать qtableview
с пользовательской модели и обычая sortfilterproxymodelSortRole в QSortFilterProxyModel не установлен
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
в proxymodel. но когда данные извлекаются с помощью метода модель data
только
- Qt :: DisplayRole
- Qt :: DecorationRole
- Qt :: FontRole
- Qt :: TextAlignmentRole
- Qt :: BackgroundRole
- Qt :: ForegroundRole
- Qt :: CheckStateRole
- Qt :: Размер HintRole
называются, но не 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);
Вы действительно установили фильтр на своей модели или включили сортировку? Ваша роль пользователя не будет запрашиваться, если вы этого не сделаете. – dunc123
Что вы подразумеваете под "set a filter"? Я включил сортировку, в настоящее время у меня есть 6 столбцов, 4 - QStrings, которые сортируются, потому что они возвращаются Qt :: DisplayRole. 2 столбца являются QIcons, которые возвращаются Qt :: DisplayRole, и они должны быть отсортированы с помощью специального целого, которое должно быть возвращено в Qt :: UserRole. – Tim
Можете ли вы разместить свой код для 'lessThan'? Если вы переопределили его, setSortRole не будет иметь эффекта, если вы его не используете самостоятельно. – dunc123