Russian Qt Forum
Ноябрь 24, 2024, 06:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как добавить тип сортировки в QHeaderView?  (Прочитано 5310 раз)
Hordi
Гость
« : Июль 08, 2010, 11:01 »

Приветствую

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

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

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


Qt-4.6.3
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Июль 08, 2010, 11:17 »

Имхо, лучше выключить авто-сортировку через QTableView/QTreeView::setSortingEnabled( false ).
На header() повесить слот на sortIndicatorChanged() и уже в нём делать сортировку.
« Последнее редактирование: Июль 08, 2010, 11:19 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Hordi
Гость
« Ответ #2 : Июль 08, 2010, 11:25 »

Как я понимаю, если стоит QTreeView::setSortingEnabled( false ), то после клика на хидер сигнал sortIndicatorChanged() генерится не будет, именно поэтому были переопределены mouse-events.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июль 08, 2010, 11:30 »

Цитировать
Как я понимаю, если стоит QTreeView::setSortingEnabled( false ), то после клика на хидер сигнал sortIndicatorChanged() генерится не будет
Неправильно понимаете. Сигнал генериться будет всегда, а вот соответствующий слот в QTreeView отрабатывать не будет.
Поэтому вам и предлагается не полагаться на этот слот, а повесить на QTreeView::header() свой собственный.

Но в любом случае вам нужно задуматься над отрисовкой sortIndicator-a в QHeaderView::paintSection(), т.к. про существование UnsortedOrder QHeaderView не имеет понятия.
« Последнее редактирование: Июль 08, 2010, 11:34 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Hordi
Гость
« Ответ #4 : Июль 08, 2010, 11:42 »

Вот проверил - все как я и говорил, т.е. если сортировка отключена - сигнал для QHeaderView не вызывается. И это логично, т.к. индикация не изменяется.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июль 08, 2010, 13:00 »

Извиняюсь, совсем забыл, что нужно добавить после выключении сортировки это:
Код
C++ (Qt)
header()->setSortIndicatorShown( true );
header()->setClickable( true );
 
Записан

Qt 5.11/4.8.7 (X11/Win)
mal
Гость
« Ответ #6 : Июль 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, сортировку делать самому!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.124 секунд. Запросов: 23.