Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: trot от Апреля 27, 2012, 13:59



Название: Вопрос про делегата
Отправлено: 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
BaseForm.h
fZRS.cpp
fZRS.h
MyComboBox.cpp
MyComboBox.h
MyItemDelegate.cpp
MyItemDelegate.h

А вод код из файла MyItemDelegate.h, который реально вставляет:
Код:
#include "MyComboBox.h"
#include "MyCheck.h"
#include "BaseWidget.h"
#include "MyGradPicker.h"
#include "MyText.h"
#include "Global.h"
#include "MyDate.h"
#include "MyDateTime.h"
#include "MyTableBox.h"
#include "MyTreeBox.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 поменяй
Код
C++ (Qt)
//setFocusProxy(m_comboBox);
на
Код
C++ (Qt)
m_comboBox->setFocusProxy(this);

Тебе же выше было сказано как решить проблему. Нужно было просто внимательно читать руководство.
И я бы просто отнаследовался от 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 известную ему базу, в противном случае всё делай сам - фильтруй клавиатурный ввод, управляй фокусом и удалением редактора.