2013-08-08 3 views
4

создать 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); 
+0

Вы действительно установили фильтр на своей модели или включили сортировку? Ваша роль пользователя не будет запрашиваться, если вы этого не сделаете. – dunc123

+0

Что вы подразумеваете под "set a filter"? Я включил сортировку, в настоящее время у меня есть 6 столбцов, 4 - QStrings, которые сортируются, потому что они возвращаются Qt :: DisplayRole. 2 столбца являются QIcons, которые возвращаются Qt :: DisplayRole, и они должны быть отсортированы с помощью специального целого, которое должно быть возвращено в Qt :: UserRole. – Tim

+0

Можете ли вы разместить свой код для 'lessThan'? Если вы переопределили его, setSortRole не будет иметь эффекта, если вы его не используете самостоятельно. – dunc123

ответ

4

Если вы переописать lessThan, то вам необходимо выполнить сами сортировки. setSortRole влияет только на реализацию по умолчанию lessThan.

0

Вы должны либо:

вызов

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

setsorting с вашей точки зрения (и нажмите столбцы)

setSortingEnabled(true); 

Установка динамической фильтрации

void QSortFilterProxyModel::setDynamicSortFilter (bool enable) 

Edit:

Обратите внимание, что в документации. Они говорят в example:

В этот момент ни сортировка, ни фильтрация не включены; в представлении отображаются исходные данные . Любые изменения, внесенные с помощью модели QSortFilterProxyModel , применяются к исходной модели.

Вы должны стрелять фильтрации/сортировки

Смежные вопросы