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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как синхронизировать Current и Selected?  (Прочитано 3789 раз)
fulkabaster
Гость
« : Февраль 14, 2010, 13:56 »

Например, создаю QTableWidget. ставлю у нее свойства:
selectionMode = SingleSelection
selectionBehaveour = SelectRows

Таблицу заполняю объектами QTableWidgetItem, кроме первого столбца, его заполняю чек-боксами QCheckBox.

В итоге если я кликаю по любой ячеке не в первом стобце, то выделяется соответствующая строка, в которой сидит эта ячейка. Но если кликаю чекбоксы, то их строка не выделяется, хотя сам чек-бокс обводится фокус-квадратиком, т.е. он становится текущим виджитом. При заполнении ячеек флаги оставляю по умолчанию (isSelectable, isEditable и т.п.).

Как сделать, чтобы строка выделялась и при клике на чекбоксах?
« Последнее редактирование: Февраль 14, 2010, 17:01 от fulkabaster » Записан
fulkabaster
Гость
« Ответ #1 : Февраль 14, 2010, 18:06 »

И еще вдогонку. Не могу разобраться с некоторыми вещами относительно вставки любого виджета в ячейку.
Вот, в другой столбец мне нужно вставлять QSpinBox-ы. Вставил. При изменении значения в спин-боксе, должно измениться содержание другой ячейки, находящейся в той же строке, что и затронутый спин-бокс. Для этого соединил сигнал таблицы cellChanged(int row, int column) со своим нужным слотом, где меняю содержимое той ячейки. Но вот только этот сигнал не испускается, если в ячейке находится не QTableWidgetItem, а QSpinBox. Понятно, что можно создавать массив указателей на спин-боксы и соединять ихсигналы valueChanged() с моим слотом, но почему не работает cellChanged?

И еще - а как выравнять виджит (тот же чек-бокс) в ячейке по горизонтали?
Записан
BRE
Гость
« Ответ #2 : Февраль 14, 2010, 18:11 »

Почитай про модели и делегаты.
Думаю большинство вопросов сразу отпадет.  Подмигивающий
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Февраль 14, 2010, 21:26 »

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

Читать про модели вас отправили правильно

А сигнал не испускался т.к. менялось состояние чекбокса а не итема в таблице.
Можно сконнектить каждый чекбокс со своей ячейкой. Или сконнектить все чекбоксы со своим слотом - но все это изврат...

Модель + Делегаты предоставят более элегентное решение.
Записан
fulkabaster
Гость
« Ответ #4 : Февраль 15, 2010, 09:26 »

Цитировать
Но если кликаю чекбоксы, то их строка не выделяется
Скорее всего даже выделяется но просто чекбокс как самостоятельный виджет рисуется поверх и уже никакого выделения не видно - попробуй сделать чтобы чекбокс занимал не всю ячейка - для проверки...
Не выделяется, так как я поставил в свойствах выделение целой строки, а не одной ячейки (см. в первом посте), а при щелкании чекбокса выделенной остается прежняя строка.

Насчет моделей/делегатов я глянул в описание и книгу Бланшет, везде указано, что они оправданы при работе с большим количеством данных. В моем случае как раз данных мало - от нескольких единици до нескольких десятков строк. Но если это решит указанные мной проблемы, то правильно ли я понимаю, что нужно использовать не QTableWidget, а QTableView?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Февраль 15, 2010, 14:09 »

Цитировать
Не выделяется, так как я поставил в свойствах выделение целой строки, а не одной ячейки (см. в первом посте), а при щелкании чекбокса выделенной остается прежняя строка.
Значит действительно не выделяется т.к. указатель мышки не попадает в ячейку - а попадает на сам виджет checkbox. Опять же рповеряется увеличив размеры ячеек так чтобы чекбокс не занимал всю ее.

Цитировать
нужно использовать не QTableWidget, а QTableView?
Правильно. И дело не только в больших объемах данные - делая на основе разделенных Модели-Представления вы будете использовать более правильную концепцию, кот. позволит избежать некоторых других проблем в будующем.

А вообще можно и с TableWidget победить - когда чекбокс получает фокус выделять строку. Правда прийдется либо в чекбоксах хранить на какой строке он стоит - либо привязаться жестко к первой строке (вроде они у вас только там).

Проверил у себя - если виджет не будет занимать всю ячейку и клукать в саму ячейку то все работает - так что дело в этом!
« Последнее редактирование: Февраль 15, 2010, 14:19 от break » Записан
fulkabaster
Гость
« Ответ #6 : Февраль 15, 2010, 15:40 »

Но это не решает мою проблему, хочется чтобы строка выделялась не только тогда, когда юзер попадает мимо чекбокса, но и когда щелкает по нему Улыбающийся
Цитировать
Правда прийдется либо в чекбоксах хранить на какой строке он стоит - либо привязаться жестко к первой строке (вроде они у вас только там).
Если бы в строке Улыбающийся Чекбоксы в первом столбце. А как можно  в чекбоксе хранить, на какой он строке стоит? Это бы решило проблему.

Еще я заметил, что среди флагов у QTableWidgetItem имеется IsCheckable. При этом по умолчанию он включен. Как это понимать? Ведь если втсавить QTableWidgetItem  в таблицу - никаких галочек там никуда не поставить.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #7 : Февраль 15, 2010, 17:53 »

Цитировать
А как можно  в чекбоксе хранить, на какой он строке стоит?
Использовать динамические проперти QObject
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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