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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableWidget и управление поведением выделения  (Прочитано 8341 раз)
UndeadDragon
Гость
« : Январь 24, 2013, 14:45 »

Привет всем! Мне нужно, чтобы стандартная таблица поддерживала выделения, но не давала пользователю их изменять. В идеале вообще, чтобы ничего нельзя было делать мышкой, кроме того, что я определю.
Долго ковырялся, пробовал eventFilter, но с ним ничего не получилось, 0 реакции.
Тогда я попробовал рассоеденить все сигнал-слоты модели выделения:
Код:
QItemSelectionModel *selectionModel = mainTable->selectionModel();
disconnect(selectionModel, 0, 0, 0);
Почти добился нужной реакции, выделение по щелчку мышки уже не скидывается и не меняется, но если зажать мышку и поводить ею по таблице, то выделение таки изменяется.
Вопрос таков, как запретить все же все эти действия с выделением и как реализовать определение, по какой именно ячейке\строке тыкнул пользователь?
Записан
Bepec
Гость
« Ответ #1 : Январь 24, 2013, 14:50 »

Сумбурно, чего хочешь непонятно.

PS формулируй лучше, а ещё лучше рисуй рисунки. В прошлой твоей теме это здорово помогло, если не изменяет мне память.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Январь 24, 2013, 14:52 »

Не пробовал отнаследоваться от QItemSelectionModel и установить ее для вьюхи?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
UndeadDragon
Гость
« Ответ #3 : Январь 24, 2013, 15:16 »

Сумбурно, чего хочешь непонятно.

PS формулируй лучше, а ещё лучше рисуй рисунки. В прошлой твоей теме это здорово помогло, если не изменяет мне память.
Да я уж постарался, что-то не вышло, раз не понял)
Ну для начала давай разберемся, как бы запретить вообще что-либо в таблице менять мышкой, в том числе выделение. Выделением нужно управлять программе, пользователю нет.
Как я сказал, после полного дисконнекта у QItemSelectionModel в таблице перестало изменятся выделение по клику мышкой, но оно все еще изменяется, если зажать мышь и поводить ею. Я не совсем понимаю кто за это ответственен и как идет этот процесс, потому, что евенты с мышкой не ловятся, а сигналы все у QItemSelectionModel отключены.

Не пробовал отнаследоваться от QItemSelectionModel и установить ее для вьюхи?
Не уверен, что тут нужно новый класс создавать, да и плохо пока понимаю, как работает QItemSelectionModel.
« Последнее редактирование: Январь 24, 2013, 15:20 от UndeadDragon » Записан
Bepec
Гость
« Ответ #4 : Январь 24, 2013, 15:28 »

Полностью запретить выделение пользователю? Хех. Достойная мысль, только зачем?

Правильно тебе Пантер советует - отнаследуйся.
Записан
UndeadDragon
Гость
« Ответ #5 : Январь 24, 2013, 20:27 »

Полностью запретить выделение пользователю? Хех. Достойная мысль, только зачем?

Правильно тебе Пантер советует - отнаследуйся.
Отнаследоваться и переопределить что? Я не знаю как работает этот класс для выделения.
Ну, мне просто нужно выводить информацию в табличном виде, выделяя важную. Для этого надо, естественно, чтобы пользователь не мог скинуть выделение тыкнув где-то там мышкой.
Просто есть же ивент фильтры и дисконнекты, чтобы избежать излишнего наследования, а тут прям тупик.
Записан
_OLEGator_
Гость
« Ответ #6 : Январь 24, 2013, 22:15 »

Выделять нужную информацию надо не так, стандартный механизм выделения немного для другого предназначен. Для выделения нужной и любой другой информацию лучше писать своего делегата у вьювера.
Записан
UndeadDragon
Гость
« Ответ #7 : Январь 25, 2013, 00:23 »

Выделять нужную информацию надо не так, стандартный механизм выделения немного для другого предназначен. Для выделения нужной и любой другой информацию лучше писать своего делегата у вьювера.
И что мне в делигат запихать? QLabel?
Просто мне очень подходило по виду выделение, казалось переделать его поведение будет легко. QLabel будет уже не совсем так смотреться. Хотя, конечно, в крайнем случае подойдет.
Записан
denka
Гость
« Ответ #8 : Январь 25, 2013, 01:22 »

setSelectionMode(QAbstractItemView::NoSelection) не оно?
Записан
UndeadDragon
Гость
« Ответ #9 : Январь 25, 2013, 01:36 »

setSelectionMode(QAbstractItemView::NoSelection) не оно?
Пробовал, но тогда вообще отключается выделение))
Записан
denka
Гость
« Ответ #10 : Январь 25, 2013, 01:45 »

Ну так ты выделение программно вроде собрался делать, setRangeSelected вроде никто не отменял.

Записан
UndeadDragon
Гость
« Ответ #11 : Январь 25, 2013, 01:59 »

Ну так ты выделение программно вроде собрался делать, setRangeSelected вроде никто не отменял.
После того флага оно вообще не отображается Улыбающийся

Всем спасибо, решил обойтись проще, методом QTableWidgetITem::setBarckground, в общем и целом устраивает и меньше ресурсов выжрет, чем делегатов пихать.

Еще убрал оставшийся пунктирный прямоугольник вокруг тыкнутой ячейки, если кому надо
Код:
setFocusPolicy(Qt::NoFocus);
« Последнее редактирование: Январь 25, 2013, 02:14 от UndeadDragon » Записан
_OLEGator_
Гость
« Ответ #12 : Январь 25, 2013, 09:26 »

Всем спасибо, решил обойтись проще, методом QTableWidgetITem::setBarckground, в общем и целом устраивает и меньше ресурсов выжрет, чем делегатов пихать.

Как вариант и это подойдет, я имел в виду делегат QTableView, который один на всю таблицу устанавливается:
Код
C++ (Qt)
void QAbstractItemView::setItemDelegate ( QAbstractItemDelegate * delegate )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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