Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Ноябрь 18, 2012, 09:19



Название: setCellWidget и setItemDelegateForColumn
Отправлено: CJ1 от Ноябрь 18, 2012, 09:19
Всем привет вот тут вопрос. Я использую setItemDelegateForColumn для установки делегатов.
setCellWidget используется установка просто widget для одной ячейки?

Ну то есть делегат нельзя установить для одной ячейки, а widget можно?
Ну то есть в в каких случаях что лучше использовать?


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Bepec от Ноябрь 18, 2012, 13:10
Смотри как тут сложно у тебя вопрос поставлен.

Точнее у тебя вопроса конкретного нет.

Да, именно так и работает, виджет можно засунуть в любую ячейку.

Да, делегат можно установить на всю таблицу, можно на колонку. А так же можно установить на колонку и получая номер строки, сделать делегаты разные для каждого номера.

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

Проще выражаясь пример - таблица из 5000 элементов.
С виджетами - у тебя будет 5000 виджетов, которые будут создаваться хзскока, тормозить всё будет неопупенно и памяти жрать немеряно.
С делегатом - делегат будет работать только на видимые ячейки. Т.е. где то 20 -100 единовременно, в зависимости от таблицы. Никаких тормозов, всё круто, память на минимуме :D


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: CJ1 от Ноябрь 18, 2012, 17:54
АААА Все теперь понятно! Спасибо!


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: kolob от Январь 11, 2013, 09:00
А как можно в одну ячейку 2 виджета установить?


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Bepec от Январь 11, 2013, 10:29
Пихаешь туда QWidget с выложенным на нём словом ФЛАГМАН из кнопок, групбоксов, лейблов и вуаля


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: kolob от Январь 11, 2013, 10:47
а если надо чтобы они независимо друг от друга редактировались, т.е. делегат вызывался сначала для lineEdit например, а потом для ComboBox?


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Bepec от Январь 11, 2013, 10:51
Делегат вызыватся для ячейки.
Не для виджета. Не для строки. Для ячейки.


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: kolob от Январь 11, 2013, 11:35
я понимаю, но если вызвать делегейт для ячейки, то появится этот самый виджет с набором необхоимых виджетов(lineEdit, ComboBox и т.д.), они все будут готовы для редактирования, а я бы хотел чтобы каждый из этих виджетов был отдельный при редактировании.


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Bepec от Январь 11, 2013, 12:11
Т.е.?
Вы можете туда засунуть креатор (если кто-то сделает его виджетом :D ) в делегат. И он будет работать и его логика не изменится.


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: kolob от Январь 11, 2013, 12:21
вот видите на рисунке, 2 виджета ComboBox размещены на tableWidget. TableWidget вызывается как делегейт. И они оба готовы к редактированию. А надо чтобы можно было их выбирать по одному

В голову пока только приходит одно, создавать 2 строки, где надо их объединять как одна. А в этом случае выставлять в каждую строку свой комбобок. И они будут вызываться по разному, в момент редактирования.

Я думал может еще есть вариант какой?


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Авварон от Январь 11, 2013, 12:34
Цитировать
Maxim1905: День добрый! У меня вопрос можно Легенду подключить в ноутбуку через блютус и писать инет через нее через GPRS? Кто нибудь пробовать, есть такая возможность?

ska_romash: Пока читать сообщение твоё, моя обрезать орган мозг и топтать и топтать его, пока читать ваша сообщение ещё раз.

ska_romash: Простите, не выдержал.

Я к чему - выражайтесь в терминах, понятных другим. Нельзя "вызвать делегат для ячейки". Его можно "установить", и только на ряд/строку, как писалось выше. "Вызывать" делегат будет вью, этот код мы контролировать не можем (не наследуясь от вью).

setCellWidget можно также только "установить" (там слово "set" есть в методе, ага) и только на ячейку. При этом виджет в ячейке будет висеть ВСЕГДА.

Далее, о "вызовах" делегата. Рисование таблицы осуществляется так, напишу на псевдокоде:
Код:
for(int row : rows) {
    for(int col : columns) {
        QModelIndex index = model()->index(row, column);
        delegateForIndex(index)->paint(painter, index);
    }
}
delegateForIndex - делегат подбирается так - ищется для делегат ряда row, если нет - для колонки col, если нет - используется тот, к-ый повешен на всю таблицу.
Я опустил StyleOption, ибо не важно.

Редактирование же осущевтляется принципиально по другому:
Код:
0) юзер ткнул редактировать ячейку index (например, даблкликнул) зовется псевдометод view->openEditor(index):
1) delegate = view->delegateForIndex(index);
2) editor = delegate->createEditor(index);
3) delegate->setEditorData(editor, index);

0) юзер ввел данные, нажал энтер, зовется псевдометод view->closeEditor(index):
1) delegate = view->delegateForIndex(index);
2) delegate->setModelData(editor, model, index);
3) delete editor;
.
Итого - редактор создается ТОЛЬКО для ОДНОЙ ячейки - которая в данный момент редактируется.
Чтобы разрешить редактирование, надо задать EditTriggers у вью и сделать ячейку редактируемой (с помощью Qt::ItemFlags, а именно Qt::ItemIsEditable)


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Bepec от Январь 11, 2013, 12:52
Не пойму я твоих желаний, ТС.

У тебя 2 комбобокса. Как ты хочешь их выбирать? нарисуй хоть в пейнте, если словами объяснить внятно не можешь.

Всю последовательность тыков и редактирования как тебе хочется нарисуй.


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: kolob от Январь 11, 2013, 12:56
цитата  ;D

Все что вы описали это понятно. За то что не понятно выражаюсь извиняйте. Про установку в ячейку я имел ввиду когда вызывается функция createEditor можно выбрать что для чего по колонкам и строкам.

Вопрос состоял в другом. Проще, картинка выше, посмотрите.

Немного проблему опишу:
 если выбираются значение в 1м комбобоксе, нужно чтобы подгружались необходимые значения во 2й. При одновременном вызове:
Код:
editor = delegate->createEditor(index);
я уже не могу после выбора в 1м что то менять во 2м комбобоксе.

Bepec все уже нарисовано (см. выше)

Может так точнее :)


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Bepec от Январь 11, 2013, 14:18
Кхм. Смотри в чём фишка. Ты не до конца понимаешь прикола.

В ячейку ты можешь сунуть виджет с любой логикой. Т.е. допустим создаём наследника QWidget с конструктором из списка и словаря (map <int, QStringList>).
Создаёшь в нём слот на выбор первого комбобокса.
В слоте пишешь аля
Код:
combobox_2->addItems(map[combobox->currentIndex()])
И при создании едитора берёшь список и словарь из модели и суёшь в конструктор. Вот и всё.

А закрытие едитора тоже можно переопределить, насколько я помню.

PS хоть ты и изъясняешься виртуозно непонятно, но я так понял у тебя одна из двух проблем:
1) ты не можешь запихнуть логику в виджеты.
2) или после выбора первого комбобокса у тебя закрывается едитор


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: kolob от Январь 11, 2013, 14:32
Я сейчас объясню как у меня уже сделано:
(в ItemDelegate)
в createEditor создается TableWidget c 2мя строками (1 колонка), в каждую строку устанавливается setCellWidget ComboBox.
к первому подключается слот на сигнал activated().
после выбора чего либо в 1м ComboBox, после срабатывания слота 2й CombBox заполняется нужной информацией.
в paint() делаю прорисовку(разделитель), как будто 2 ячейки, значение в ячейку устанавливаю setDate через '\n' чтобы были на разных строках
В момент вызова делегейта они выглядят так как на картинке.

А хотел чтобы 2й ComboBox выглядел как пустая ячейка. А потом когда кликили бы на него он становился ComboBox. Блин что опять сложно :)


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Bepec от Январь 11, 2013, 14:39
Счас уже понятнее % на 80 :D

Что тебе мешает в дизайнере кинуть на виджет 2 комбобокса и один скрыть? :)
А при щелчке на эту область его show'ить? :)
Зачем тут TableView дополнительный? :)


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Авварон от Январь 11, 2013, 15:37
Не факт, что я понял верно, но - почему бы в тейбл вью с 2мя ячейками не сделать еще комбобокс-делегат номер 2.

При открытии редактора в делегате 1 (тейблвью) мы говорим тейбл вью открыть редактор в ячейке 1.
Эдит триггер у тейбл вью ставим на клик.

Правда я не очень понимаю, как закрыть такой редактор.


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: kolob от Январь 11, 2013, 15:39
Цитировать
Что тебе мешает в дизайнере кинуть на виджет 2 комбобокса и один скрыть? Улыбающийся
А при щелчке на эту область его show'ить? Улыбающийся
Зачем тут TableView дополнительный? Улыбающийся
да это вариант. что то я зациклился на таблицах.


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Авварон от Январь 11, 2013, 15:41
Цитировать
Что тебе мешает в дизайнере кинуть на виджет 2 комбобокса и один скрыть? Улыбающийся
А при щелчке на эту область его show'ить? Улыбающийся
Зачем тут TableView дополнительный? Улыбающийся
да это вариант. что то я зациклился на таблицах.

ыы, я тоже че-то на таблицу стал думать - сказано таблицу, значит таблицу)))


Название: Re: setCellWidget и setItemDelegateForColumn
Отправлено: Bepec от Январь 11, 2013, 15:45
Таблица в делегате ячейки таблицы, тем более QTableWidget не есть хорошо. Это model + view+ делегат (основные)  + model + view + делегат (ячеечные) + item'ов 2 штуки + комбики 2 штуки + ещё делегаты предлагают :D  

А гораздо проще виджет с комбами.  :D

PS "Мастер простых решений" ©