QTableView отключает сортировку для некоторых столбцов

Я использую QtableView (qt5.9) с 10 столбцами и хочу отключить сортировку для 2-го и 3-го (только некоторых) столбцов, когда пользователь щелкает заголовок этих столбцов.

  • Я использую флаг setsortingenabled, чтобы мой QtableView разрешал сортировку

  • Есть ли какой-либо сигнал, который я должен слушать при нажатии на заголовок, а затем вызывать какой-либо соответствующий метод или запрещать сортировку.


person mapuna    schedule 09.11.2017    source источник
comment
вы пытались использовать QSortFilterProxyModel?   -  person Simon    schedule 09.11.2017
comment
@simon да, я пробовал QSortFilterProxyModel, но я вижу там только полезный метод lessthan, а также нажатие на заголовок вызывает sortbycolum вида, так как в QSortFilterProxyModel я могу предотвратить сортировку любых предложений   -  person mapuna    schedule 09.11.2017
comment
возможно, можно попробовать сигнал заголовка sortIndicatorChanged   -  person Simon    schedule 09.11.2017


Ответы (2)


Вы можете использовать сигнал заголовка sortIndicatorChanged, чтобы восстановить текущий индикатор сортировки.

Пример:

    connect(m_poTableView->header(), &QHeaderView::sortIndicatorChanged,
            this, &MyClass::HandleIndicatorChanged);


    MyClass::HandleIndicatorChanged(int logicalIndex, Qt::SortOrder eSort)
    {
       if (logicalIndex != 0)
       {
             this->m_poTableView->horizontalHeader()->setSortIndicator(
                0, this->m_poTableView->model()->sortOrder());
       }
    }
person Simon    schedule 09.11.2017
comment
@mapuna, вам нужна еще помощь с этим вопросом? - person Simon; 12.11.2017

Более простой способ (по крайней мере, для меня) — создать подкласс прокси-фильтра и переопределить сортировку только для отключенных столбцов. Приведенный ниже код написан на Python, но это простой перевод на C++.

def CustomSorter(QtCor.QSortFilterProxyModel):
  def sort(self, column: int, order: QtCore.Qt.SortOrder) -> None:
    if column == 2 or column == 3:
      # Do nothing instead of sorting
      return
    else:
      # Sort as usual
      super().sort(column, order)
person ntjess    schedule 20.01.2020