Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Hordi от Июль 08, 2010, 11:01



Название: Как добавить тип сортировки в QHeaderView?
Отправлено: Hordi от Июль 08, 2010, 11:01
Приветствую

В текущей реализации QHeaderView есть 2 режима сортировки - Qt::AscendingOrder и Qt::DescendingOrder. Мне необходимо добавить третий режим - БЕЗ СОРТИРОВКИ.

Сейчас я сделал так - перекрыл mousePressEvent & mouseReleaseEvent и обрабатываю все клики самостоятельно, но появилась проблема - теперь невозможно перетаскивать колонки, т.к. необходим вызов родительского mousePressEvent, а я его не пускаю, т.к. я сам контроллирую изменение типа сортировки.

Идей как подрубить перетаскивание пока не родил... Хелп плиз.


Qt-4.6.3


Название: Re: Как добавить тип сортировки в QHeaderView?
Отправлено: GreatSnake от Июль 08, 2010, 11:17
Имхо, лучше выключить авто-сортировку через QTableView/QTreeView::setSortingEnabled( false ).
На header() повесить слот на sortIndicatorChanged() и уже в нём делать сортировку.


Название: Re: Как добавить тип сортировки в QHeaderView?
Отправлено: Hordi от Июль 08, 2010, 11:25
Как я понимаю, если стоит QTreeView::setSortingEnabled( false ), то после клика на хидер сигнал sortIndicatorChanged() генерится не будет, именно поэтому были переопределены mouse-events.


Название: Re: Как добавить тип сортировки в QHeaderView?
Отправлено: GreatSnake от Июль 08, 2010, 11:30
Цитировать
Как я понимаю, если стоит QTreeView::setSortingEnabled( false ), то после клика на хидер сигнал sortIndicatorChanged() генерится не будет
Неправильно понимаете. Сигнал генериться будет всегда, а вот соответствующий слот в QTreeView отрабатывать не будет.
Поэтому вам и предлагается не полагаться на этот слот, а повесить на QTreeView::header() свой собственный.

Но в любом случае вам нужно задуматься над отрисовкой sortIndicator-a в QHeaderView::paintSection(), т.к. про существование UnsortedOrder QHeaderView не имеет понятия.


Название: Re: Как добавить тип сортировки в QHeaderView?
Отправлено: Hordi от Июль 08, 2010, 11:42
Вот проверил - все как я и говорил, т.е. если сортировка отключена - сигнал для QHeaderView не вызывается. И это логично, т.к. индикация не изменяется.


Название: Re: Как добавить тип сортировки в QHeaderView?
Отправлено: GreatSnake от Июль 08, 2010, 13:00
Извиняюсь, совсем забыл, что нужно добавить после выключении сортировки это:
Код
C++ (Qt)
header()->setSortIndicatorShown( true );
header()->setClickable( true );
 


Название: Re: Как добавить тип сортировки в QHeaderView?
Отправлено: mal от Июль 09, 2010, 15:23
Например так:
Код:
p_tbl = ui.tableWidget;
pH = NULL;
pH = p_tbl->horizontalHeader();
    connect((QObject*)pH, SIGNAL(sectionClicked (int)), this, SLOT(slot_sortedByColumn(int)));
pH->setSortIndicatorShown(true);
а в слоте уже сортируешь сам, как тебе надо.
Пару раз наступив на грабли с включенной автосортировкой,  себе под стекло я положил бумажку с такой вот надписью:
Цитировать
QTableWidget в  ui Никогда не ставить  SortingEnabled=true, всегда false, сортировку делать самому!