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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: setCellWidget и setItemDelegateForColumn  (Прочитано 11119 раз)
CJ1
Гость
« : Ноябрь 18, 2012, 09:19 »

Всем привет вот тут вопрос. Я использую setItemDelegateForColumn для установки делегатов.
setCellWidget используется установка просто widget для одной ячейки?

Ну то есть делегат нельзя установить для одной ячейки, а widget можно?
Ну то есть в в каких случаях что лучше использовать?
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 18, 2012, 13:10 »

Смотри как тут сложно у тебя вопрос поставлен.

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

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

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

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

Проще выражаясь пример - таблица из 5000 элементов.
С виджетами - у тебя будет 5000 виджетов, которые будут создаваться хзскока, тормозить всё будет неопупенно и памяти жрать немеряно.
С делегатом - делегат будет работать только на видимые ячейки. Т.е. где то 20 -100 единовременно, в зависимости от таблицы. Никаких тормозов, всё круто, память на минимуме Веселый
Записан
CJ1
Гость
« Ответ #2 : Ноябрь 18, 2012, 17:54 »

АААА Все теперь понятно! Спасибо!
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #3 : Январь 11, 2013, 09:00 »

А как можно в одну ячейку 2 виджета установить?
Записан

Qt 5.11.0, Win, MinGW
Bepec
Гость
« Ответ #4 : Январь 11, 2013, 10:29 »

Пихаешь туда QWidget с выложенным на нём словом ФЛАГМАН из кнопок, групбоксов, лейблов и вуаля
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #5 : Январь 11, 2013, 10:47 »

а если надо чтобы они независимо друг от друга редактировались, т.е. делегат вызывался сначала для lineEdit например, а потом для ComboBox?
Записан

Qt 5.11.0, Win, MinGW
Bepec
Гость
« Ответ #6 : Январь 11, 2013, 10:51 »

Делегат вызыватся для ячейки.
Не для виджета. Не для строки. Для ячейки.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #7 : Январь 11, 2013, 11:35 »

я понимаю, но если вызвать делегейт для ячейки, то появится этот самый виджет с набором необхоимых виджетов(lineEdit, ComboBox и т.д.), они все будут готовы для редактирования, а я бы хотел чтобы каждый из этих виджетов был отдельный при редактировании.
Записан

Qt 5.11.0, Win, MinGW
Bepec
Гость
« Ответ #8 : Январь 11, 2013, 12:11 »

Т.е.?
Вы можете туда засунуть креатор (если кто-то сделает его виджетом Веселый ) в делегат. И он будет работать и его логика не изменится.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #9 : Январь 11, 2013, 12:21 »

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

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

Я думал может еще есть вариант какой?
« Последнее редактирование: Январь 11, 2013, 12:24 от kolob » Записан

Qt 5.11.0, Win, MinGW
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Январь 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)
Записан
Bepec
Гость
« Ответ #11 : Январь 11, 2013, 12:52 »

Не пойму я твоих желаний, ТС.

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

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

Сообщений: 296



Просмотр профиля
« Ответ #12 : Январь 11, 2013, 12:56 »

цитата  Смеющийся

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

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

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

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

Может так точнее Улыбающийся
Записан

Qt 5.11.0, Win, MinGW
Bepec
Гость
« Ответ #13 : Январь 11, 2013, 14:18 »

Кхм. Смотри в чём фишка. Ты не до конца понимаешь прикола.

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

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

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

Сообщений: 296



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

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

А хотел чтобы 2й ComboBox выглядел как пустая ячейка. А потом когда кликили бы на него он становился ComboBox. Блин что опять сложно Улыбающийся
« Последнее редактирование: Январь 11, 2013, 14:35 от kolob » Записан

Qt 5.11.0, Win, MinGW
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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