Russian Qt Forum
Мая 28, 2025, 23:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Вопрос про делегата  (Прочитано 13527 раз)
trot
Гость
« : Апреля 27, 2012, 13:59 »

Здравствуйте. Объясните пожайлуста. Есть класс QItemDelegate, на основе которого можно создавать свои делегаты.
Я так понимаю, что одному экземпляру класса QItemDelegate всегда соответствует порождаемый им объект editor типа QWidget. Если это так, то зачем тогда надо каждый раз передовать в методы класса (QItemDelegate) editor, если его можно сделать членом класса.
Спасибо.
Записан
Bepec
Гость
« Ответ #1 : Апреля 27, 2012, 14:08 »

Потому что editor разный, для разных типов данных.
Для строк - lineEdit.
Для чисел - spinBox.
Для флагов - bool.
И для твоего типа - твой произвольный виджет.
Записан
trot
Гость
« Ответ #2 : Апреля 27, 2012, 14:15 »

Я понимаю, что он разный. В параметрах метода эта особенность ни как не учитывается, т.е. приходит едитор типа QWidget.
Почему его не сделать членом класса типа QWidget?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Апреля 27, 2012, 14:22 »

Потому что один делегат может (обычно) использоваться для всей таблицы, а вот у каждой ячейки может быть свой editor.
Записан

Qt 5.11/4.8.7 (X11/Win)
trot
Гость
« Ответ #4 : Апреля 27, 2012, 14:38 »

Для таблицы, колонки и ячейки устанавливается делегат, а не editor. Если мы хотим, для разных ячеек создать свой элемент ввода, то мы должны в первую очередь создать делегат и после привязать его к ячейки, а уже в самом делегате мы определяем поведение соответствуюещего ему едитора.
Одному делегату соответствует один едитор.

Может в данной ситуации класс делегата надо было сделать в виде шаблона.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Апреля 27, 2012, 14:46 »

Одному делегату соответствует один едитор.
Перед тем как нести чушь, посмотрел бы хотя бы описание QItemDelegate, а именно QItemDelegate::setItemEditorFactory().

Цитировать
Может в данной ситуации класс делегата надо было сделать в виде шаблона.
Имеем то, что имеем.
Записан

Qt 5.11/4.8.7 (X11/Win)
trot
Гость
« Ответ #6 : Апреля 27, 2012, 16:14 »

Таблица создает по умолчанию один делегат (если не укажем иное поведение). Этот делегат в момент редактирования создает один и только один едитор для той ячейки которую редактируем, тип едитора устанавливается в зависимости от типа данных в ячейке. Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки. Всегда имеем один едитор, почему указатель на него не хранится в делегате.
Едитор не может сущестовать без делегата. Зачем каждый раз в делегат передается указатель на едитор.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Апреля 27, 2012, 16:26 »

Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки.
"делегат разрушается" ? Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
trot
Гость
« Ответ #8 : Апреля 27, 2012, 16:30 »

Конечно же эдитор разрушается. Это была опечатка.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Мая 02, 2012, 11:08 »

Таблица создает по умолчанию один делегат (если не укажем иное поведение). Этот делегат в момент редактирования создает один и только один едитор для той ячейки которую редактируем, тип едитора устанавливается в зависимости от типа данных в ячейке. Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки. Всегда имеем один едитор, почему указатель на него не хранится в делегате.
Едитор не может сущестовать без делегата. Зачем каждый раз в делегат передается указатель на едитор.

Моск включите. Если этого не делать то имеем 2 варианта - либо сами запоминаем редактор (зашибись, в каждом делегате писать один и тот же код), либо после вызова createEditor вьюха ставит в переменную делегата редактор, а при закрытии пишет 0. Огребаем миллион нюансов - "а когда можно использовать значение переменной а когда нет", которые надо разжевать в доке, а прогррамеру надо за этим следить.
А тут ВСЕГДА в момент вызова ф-ии виджет валиден и думать не надо.
Записан
trot
Гость
« Ответ #10 : Мая 02, 2012, 14:16 »

Все понятно. Вопрос, как мне в программе узнать какие едиторы валидны, т.е. созданы?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Мая 02, 2012, 14:25 »

Все понятно. Вопрос, как мне в программе узнать какие едиторы валидны, т.е. созданы?
Об этом даже и думать не имеет смысла, т.к. Qt сам их уничножает.
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #12 : Мая 02, 2012, 14:34 »

Вопрос - зачем вы, trot, лезете внутрь прекрасно отлаженного механизма???

Хотя вполне могу понять желание познавать новое Подмигивающий Но всё же?
Записан
trot
Гость
« Ответ #13 : Мая 02, 2012, 15:25 »

Одна из проблем, которая не раз обсуждалась, это не разрушение едитора (в частности combobox) при уходе фокуса с едитора. И тут начинаются трюки с фокусом.
Записан
Bepec
Гость
« Ответ #14 : Мая 02, 2012, 15:42 »

Кхм. А суть этой проблемы не опишите в 2 словах?

А то я наверно или в упор игнорирую эту тему, или же слишком недавно тут,
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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