Название: Вопрос про делегата Отправлено: trot от Апреля 27, 2012, 13:59 Здравствуйте. Объясните пожайлуста. Есть класс QItemDelegate, на основе которого можно создавать свои делегаты.
Я так понимаю, что одному экземпляру класса QItemDelegate всегда соответствует порождаемый им объект editor типа QWidget. Если это так, то зачем тогда надо каждый раз передовать в методы класса (QItemDelegate) editor, если его можно сделать членом класса. Спасибо. Название: Re: Вопрос про делегата Отправлено: Bepec от Апреля 27, 2012, 14:08 Потому что editor разный, для разных типов данных.
Для строк - lineEdit. Для чисел - spinBox. Для флагов - bool. И для твоего типа - твой произвольный виджет. Название: Re: Вопрос про делегата Отправлено: trot от Апреля 27, 2012, 14:15 Я понимаю, что он разный. В параметрах метода эта особенность ни как не учитывается, т.е. приходит едитор типа QWidget.
Почему его не сделать членом класса типа QWidget? Название: Re: Вопрос про делегата Отправлено: GreatSnake от Апреля 27, 2012, 14:22 Потому что один делегат может (обычно) использоваться для всей таблицы, а вот у каждой ячейки может быть свой editor.
Название: Re: Вопрос про делегата Отправлено: trot от Апреля 27, 2012, 14:38 Для таблицы, колонки и ячейки устанавливается делегат, а не editor. Если мы хотим, для разных ячеек создать свой элемент ввода, то мы должны в первую очередь создать делегат и после привязать его к ячейки, а уже в самом делегате мы определяем поведение соответствуюещего ему едитора.
Одному делегату соответствует один едитор. Может в данной ситуации класс делегата надо было сделать в виде шаблона. Название: Re: Вопрос про делегата Отправлено: GreatSnake от Апреля 27, 2012, 14:46 Одному делегату соответствует один едитор. Перед тем как нести чушь, посмотрел бы хотя бы описание QItemDelegate, а именно QItemDelegate::setItemEditorFactory().Цитировать Может в данной ситуации класс делегата надо было сделать в виде шаблона. Имеем то, что имеем.Название: Re: Вопрос про делегата Отправлено: trot от Апреля 27, 2012, 16:14 Таблица создает по умолчанию один делегат (если не укажем иное поведение). Этот делегат в момент редактирования создает один и только один едитор для той ячейки которую редактируем, тип едитора устанавливается в зависимости от типа данных в ячейке. Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки. Всегда имеем один едитор, почему указатель на него не хранится в делегате.
Едитор не может сущестовать без делегата. Зачем каждый раз в делегат передается указатель на едитор. Название: Re: Вопрос про делегата Отправлено: GreatSnake от Апреля 27, 2012, 16:26 Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки. "делегат разрушается" ? ???Название: Re: Вопрос про делегата Отправлено: trot от Апреля 27, 2012, 16:30 Конечно же эдитор разрушается. Это была опечатка.
Название: Re: Вопрос про делегата Отправлено: Авварон от Мая 02, 2012, 11:08 Таблица создает по умолчанию один делегат (если не укажем иное поведение). Этот делегат в момент редактирования создает один и только один едитор для той ячейки которую редактируем, тип едитора устанавливается в зависимости от типа данных в ячейке. Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки. Всегда имеем один едитор, почему указатель на него не хранится в делегате. Едитор не может сущестовать без делегата. Зачем каждый раз в делегат передается указатель на едитор. Моск включите. Если этого не делать то имеем 2 варианта - либо сами запоминаем редактор (зашибись, в каждом делегате писать один и тот же код), либо после вызова createEditor вьюха ставит в переменную делегата редактор, а при закрытии пишет 0. Огребаем миллион нюансов - "а когда можно использовать значение переменной а когда нет", которые надо разжевать в доке, а прогррамеру надо за этим следить. А тут ВСЕГДА в момент вызова ф-ии виджет валиден и думать не надо. Название: Re: Вопрос про делегата Отправлено: trot от Мая 02, 2012, 14:16 Все понятно. Вопрос, как мне в программе узнать какие едиторы валидны, т.е. созданы?
Название: Re: Вопрос про делегата Отправлено: GreatSnake от Мая 02, 2012, 14:25 Все понятно. Вопрос, как мне в программе узнать какие едиторы валидны, т.е. созданы? Об этом даже и думать не имеет смысла, т.к. Qt сам их уничножает.Название: Re: Вопрос про делегата Отправлено: Bepec от Мая 02, 2012, 14:34 Вопрос - зачем вы, trot, лезете внутрь прекрасно отлаженного механизма???
Хотя вполне могу понять желание познавать новое ;) Но всё же? Название: Re: Вопрос про делегата Отправлено: trot от Мая 02, 2012, 15:25 Одна из проблем, которая не раз обсуждалась, это не разрушение едитора (в частности combobox) при уходе фокуса с едитора. И тут начинаются трюки с фокусом.
Название: Re: Вопрос про делегата Отправлено: Bepec от Мая 02, 2012, 15:42 Кхм. А суть этой проблемы не опишите в 2 словах?
А то я наверно или в упор игнорирую эту тему, или же слишком недавно тут, Название: Re: Вопрос про делегата Отправлено: trot от Мая 02, 2012, 16:04 http://www.prog.org.ru/topic_11705_0.html
Название: Re: Вопрос про делегата Отправлено: Bepec от Мая 02, 2012, 23:16 Насколько я понял, прочитав последнюю реплику, проблема была решена? Оо.
В чём проблем? Название: Re: Вопрос про делегата Отправлено: trot от Мая 03, 2012, 09:55 Казалось бы разобрался. Едитор разрушается когда уходит фокус. На простом примере так и работает.
Но у меня в программе фокус установлен на другом элементе, а едитор не разрушается. Не понимаю почему. И мне его приходиться разрушает принудительно. Название: Re: Вопрос про делегата Отправлено: Bepec от Мая 03, 2012, 10:20 Значит надо выкладывать ТВОЙ код и разбираться, не? :)
Название: Re: Вопрос про делегата Отправлено: trot от Мая 03, 2012, 10:57 Выкладываю фрагмент кода. Весь код выложить не могу
Название: Re: Вопрос про делегата Отправлено: Bepec от Мая 03, 2012, 12:11 Кхм. Ты реально веришь в то, что выложив 6 файлов из проекта, со всеми зависимостями/инклудами и взаимодействиями, что кто-то будет отлаживать твой код, вырезать зависимости и/или ставить заглушки? О_о
А впоследствии тебе покажет правильное решение, незная всей архитектуры проекта? О_о_О Не говори мне, что ты реально так думаешь... Это заставляет усомниться в твоём желании разобраться. PS есть такое понятие - минимально компилируемый проект. Это проект, собранный ТОБОЙ, который готов к запуску сразу после скачивания, в котором содержится твоя ПРОБЛЕМА. Советую такой тебе сделать. PPS Если же есть фанаты разбираться в чужом коде - отпишитесь, я всех перепишу ;) Update: В архиве находятся: Код: BaseForm.cpp А вод код из файла MyItemDelegate.h, который реально вставляет: Код: #include "MyComboBox.h" Название: Re: Вопрос про делегата Отправлено: GreatSnake от Мая 03, 2012, 12:22 Выкладываю фрагмент кода. Весь код выложить не могу Мде... Нагородил огород, однако.Во-первых, почему при создании MyComboBox нельзя было просто отнаследоваться от QComboBox, а не создавать его на непонятной связке BaseWidgetText+ICtrlDelegate? И коли уж дошло до этого, то достаточно было выставить setFocusProxy(), чтобы решить проблемы с фокусом. Название: Re: Вопрос про делегата Отправлено: trot от Мая 03, 2012, 13:38 Весь проект скинуть не реально. Это надо базу данных кидать. А обрезать его для минимально компиляции уйдет не мало времени. А насчет setFocusProxy() надо конечно попробовать разобраться. Попробую на своем простом примере повторить не желательную ситуацию. Как только это сделаю сразу скину проект или если решу проблему то отпишусь.
Название: Re: Вопрос про делегата Отправлено: Bepec от Мая 03, 2012, 13:46 Вот то, что ты называешь простым примером - является минимально компилируемым проектом.
Если не можешь/нет времени/нет желания сделать его - что сказать. Надейся только на телепатов, aka Пантер. Название: Re: Вопрос про делегата Отправлено: trot от Мая 05, 2012, 08:46 Создал минимально компилируемый проект, который повторяет ситуацию, не разрушения едитора при уходе с него фокуса.
Чтобы это продемонстрировать нужно создать едитор, кликнуть по нему, чтобы появился курсор и после этого кликнуть либо в lineedit, который находится вне таблицы, либо кликнуть по кнопке. При этом едитор не разрушается, а нужно, чтобы он разрушался. Как это сделать? Название: Re: Вопрос про делегата Отправлено: GreatSnake от Мая 05, 2012, 10:49 Во-первых...
Мдя, пока заставил собраться твой проект, несколько раз уже хотел снести его и мысленно посылал автора куда-нибудь подальше. trot, помимо ntfs, есть ещё и другие файловые системы, которым абсолютно не безразличен регистр в названии файлов. К тому же в spinboxdelegate.pro не все файлы были добавлены. Во-вторых... в MyComboBox.cpp поменяй Код на Код
Тебе же выше было сказано как решить проблему. Нужно было просто внимательно читать руководство. И я бы просто отнаследовался от QComboBox, а не городил огород. Название: Re: Вопрос про делегата Отправлено: trot от Мая 05, 2012, 11:05 Поменял. В этом случае вообще невозможно что-либо ввести в lineedit, только можно выбирать из списка.
Цитировать И я бы просто отнаследовался от QComboBox, а не городил огород. А если мне надо именно так, как я сделал. Что в этом случае натыкаемся на ограничение Qt, в части делегатов. Название: Re: Вопрос про делегата Отправлено: GreatSnake от Мая 05, 2012, 11:26 А если мне надо именно так, как я сделал. Что в этом случае натыкаемся на ограничение Qt, в части делегатов. Ну тогда продолжай трахаться, ибо нечего лезть в чужой монастырь со своим уставом.К тому же абсолютно непонятно, почему тебе "надо именно так". Название: Re: Вопрос про делегата Отправлено: trot от Мая 05, 2012, 11:52 Да я вроде и нелезу со своим уставом. Нигде не сказано, что я так не могу создавать виджеты. А в данном примере всего лишь частный случай для демонстрации того что имеем. И если это ограничение, то тогда люди должны об этом знать, чтобы это учитывать при проектированиии приложения.
Название: Re: Вопрос про делегата Отправлено: GreatSnake от Мая 05, 2012, 12:01 Нигде не сказано, что я так не могу создавать виджеты. А в данном примере всего лишь частный случай для демонстрации того что имеем. И если это ограничение, то тогда люди должны об этом знать, чтобы это учитывать при проектированиии приложения. Ты подсовываешь свой "black-box" editor в ItemView. В этом editor-e input фокус имеет его потомок, про существование которого ItemView не имеет ни малейшего понятия. И ты удивляешься почему всё работает не так как ты хочешь. Хочешь, чтобы всё работало автоматом, подсовывай ItemView известную ему базу, в противном случае всё делай сам - фильтруй клавиатурный ввод, управляй фокусом и удалением редактора. |