Russian Qt Forum

Qt => Общие вопросы => Тема начата: fulkabaster от Февраль 14, 2010, 13:56



Название: Как синхронизировать Current и Selected?
Отправлено: fulkabaster от Февраль 14, 2010, 13:56
Например, создаю QTableWidget. ставлю у нее свойства:
selectionMode = SingleSelection
selectionBehaveour = SelectRows

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

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

Как сделать, чтобы строка выделялась и при клике на чекбоксах?


Название: Re: Как синхронизировать Current и Selected?
Отправлено: fulkabaster от Февраль 14, 2010, 18:06
И еще вдогонку. Не могу разобраться с некоторыми вещами относительно вставки любого виджета в ячейку.
Вот, в другой столбец мне нужно вставлять QSpinBox-ы. Вставил. При изменении значения в спин-боксе, должно измениться содержание другой ячейки, находящейся в той же строке, что и затронутый спин-бокс. Для этого соединил сигнал таблицы cellChanged(int row, int column) со своим нужным слотом, где меняю содержимое той ячейки. Но вот только этот сигнал не испускается, если в ячейке находится не QTableWidgetItem, а QSpinBox. Понятно, что можно создавать массив указателей на спин-боксы и соединять ихсигналы valueChanged() с моим слотом, но почему не работает cellChanged?

И еще - а как выравнять виджит (тот же чек-бокс) в ячейке по горизонтали?


Название: Re: Как синхронизировать Current и Selected?
Отправлено: BRE от Февраль 14, 2010, 18:11
Почитай про модели и делегаты.
Думаю большинство вопросов сразу отпадет.  ;)


Название: Re: Как синхронизировать Current и Selected?
Отправлено: break от Февраль 14, 2010, 21:26
Цитировать
Но если кликаю чекбоксы, то их строка не выделяется
Скорее всего даже выделяется но просто чекбокс как самостоятельный виджет рисуется поверх и уже никакого выделения не видно - попробуй сделать чтобы чекбокс занимал не всю ячейка - для проверки...

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

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

Модель + Делегаты предоставят более элегентное решение.


Название: Re: Как синхронизировать Current и Selected?
Отправлено: fulkabaster от Февраль 15, 2010, 09:26
Цитировать
Но если кликаю чекбоксы, то их строка не выделяется
Скорее всего даже выделяется но просто чекбокс как самостоятельный виджет рисуется поверх и уже никакого выделения не видно - попробуй сделать чтобы чекбокс занимал не всю ячейка - для проверки...
Не выделяется, так как я поставил в свойствах выделение целой строки, а не одной ячейки (см. в первом посте), а при щелкании чекбокса выделенной остается прежняя строка.

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


Название: Re: Как синхронизировать Current и Selected?
Отправлено: break от Февраль 15, 2010, 14:09
Цитировать
Не выделяется, так как я поставил в свойствах выделение целой строки, а не одной ячейки (см. в первом посте), а при щелкании чекбокса выделенной остается прежняя строка.
Значит действительно не выделяется т.к. указатель мышки не попадает в ячейку - а попадает на сам виджет checkbox. Опять же рповеряется увеличив размеры ячеек так чтобы чекбокс не занимал всю ее.

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

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

Проверил у себя - если виджет не будет занимать всю ячейку и клукать в саму ячейку то все работает - так что дело в этом!


Название: Re: Как синхронизировать Current и Selected?
Отправлено: fulkabaster от Февраль 15, 2010, 15:40
Но это не решает мою проблему, хочется чтобы строка выделялась не только тогда, когда юзер попадает мимо чекбокса, но и когда щелкает по нему :)
Цитировать
Правда прийдется либо в чекбоксах хранить на какой строке он стоит - либо привязаться жестко к первой строке (вроде они у вас только там).
Если бы в строке :) Чекбоксы в первом столбце. А как можно  в чекбоксе хранить, на какой он строке стоит? Это бы решило проблему.

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


Название: Re: Как синхронизировать Current и Selected?
Отправлено: break от Февраль 15, 2010, 17:53
Цитировать
А как можно  в чекбоксе хранить, на какой он строке стоит?
Использовать динамические проперти QObject