Russian Qt Forum
Мая 28, 2025, 23:41
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Вопрос про делегата
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Вопрос про делегата (Прочитано 13527 раз)
trot
Гость
Вопрос про делегата
«
:
Апреля 27, 2012, 13:59 »
Здравствуйте. Объясните пожайлуста. Есть класс QItemDelegate, на основе которого можно создавать свои делегаты.
Я так понимаю, что одному экземпляру класса QItemDelegate всегда соответствует порождаемый им объект editor типа QWidget. Если это так, то зачем тогда надо каждый раз передовать в методы класса (QItemDelegate) editor, если его можно сделать членом класса.
Спасибо.
Записан
Bepec
Гость
Re: Вопрос про делегата
«
Ответ #1 :
Апреля 27, 2012, 14:08 »
Потому что editor разный, для разных типов данных.
Для строк - lineEdit.
Для чисел - spinBox.
Для флагов - bool.
И для твоего типа - твой произвольный виджет.
Записан
trot
Гость
Re: Вопрос про делегата
«
Ответ #2 :
Апреля 27, 2012, 14:15 »
Я понимаю, что он разный. В параметрах метода эта особенность ни как не учитывается, т.е. приходит едитор типа QWidget.
Почему его не сделать членом класса типа QWidget?
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Вопрос про делегата
«
Ответ #3 :
Апреля 27, 2012, 14:22 »
Потому что один делегат может (обычно) использоваться для всей таблицы, а вот у каждой ячейки может быть свой editor.
Записан
Qt 5.11/4.8.7 (X11/Win)
trot
Гость
Re: Вопрос про делегата
«
Ответ #4 :
Апреля 27, 2012, 14:38 »
Для таблицы, колонки и ячейки устанавливается делегат, а не editor. Если мы хотим, для разных ячеек создать свой элемент ввода, то мы должны в первую очередь создать делегат и после привязать его к ячейки, а уже в самом делегате мы определяем поведение соответствуюещего ему едитора.
Одному делегату соответствует один едитор.
Может в данной ситуации класс делегата надо было сделать в виде шаблона.
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Вопрос про делегата
«
Ответ #5 :
Апреля 27, 2012, 14:46 »
Цитата: trot от Апреля 27, 2012, 14:38
Одному делегату соответствует один едитор.
Перед тем как нести чушь, посмотрел бы хотя бы описание QItemDelegate, а именно QItemDelegate::setItemEditorFactory().
Цитировать
Может в данной ситуации класс делегата надо было сделать в виде шаблона.
Имеем то, что имеем.
Записан
Qt 5.11/4.8.7 (X11/Win)
trot
Гость
Re: Вопрос про делегата
«
Ответ #6 :
Апреля 27, 2012, 16:14 »
Таблица создает по умолчанию один делегат (если не укажем иное поведение). Этот делегат в момент редактирования создает один и только один едитор для той ячейки которую редактируем, тип едитора устанавливается в зависимости от типа данных в ячейке. Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки. Всегда имеем один едитор, почему указатель на него не хранится в делегате.
Едитор не может сущестовать без делегата. Зачем каждый раз в делегат передается указатель на едитор.
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Вопрос про делегата
«
Ответ #7 :
Апреля 27, 2012, 16:26 »
Цитата: trot от Апреля 27, 2012, 16:14
Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки.
"делегат разрушается" ?
Записан
Qt 5.11/4.8.7 (X11/Win)
trot
Гость
Re: Вопрос про делегата
«
Ответ #8 :
Апреля 27, 2012, 16:30 »
Конечно же эдитор разрушается. Это была опечатка.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Вопрос про делегата
«
Ответ #9 :
Мая 02, 2012, 11:08 »
Цитата: trot от Апреля 27, 2012, 16:14
Таблица создает по умолчанию один делегат (если не укажем иное поведение). Этот делегат в момент редактирования создает один и только один едитор для той ячейки которую редактируем, тип едитора устанавливается в зависимости от типа данных в ячейке. Если выбирается другая ячейка, то текущий делегат разрушается и создается новый едитор для новой ячейки. Всегда имеем один едитор, почему указатель на него не хранится в делегате.
Едитор не может сущестовать без делегата. Зачем каждый раз в делегат передается указатель на едитор.
Моск включите. Если этого не делать то имеем 2 варианта - либо сами запоминаем редактор (зашибись, в каждом делегате писать один и тот же код), либо после вызова createEditor вьюха ставит в переменную делегата редактор, а при закрытии пишет 0. Огребаем миллион нюансов - "а когда можно использовать значение переменной а когда нет", которые надо разжевать в доке, а прогррамеру надо за этим следить.
А тут ВСЕГДА в момент вызова ф-ии виджет валиден и думать не надо.
Записан
trot
Гость
Re: Вопрос про делегата
«
Ответ #10 :
Мая 02, 2012, 14:16 »
Все понятно. Вопрос, как мне в программе узнать какие едиторы валидны, т.е. созданы?
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Вопрос про делегата
«
Ответ #11 :
Мая 02, 2012, 14:25 »
Цитата: trot от Мая 02, 2012, 14:16
Все понятно. Вопрос, как мне в программе узнать какие едиторы валидны, т.е. созданы?
Об этом даже и думать не имеет смысла, т.к. Qt сам их уничножает.
Записан
Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
Re: Вопрос про делегата
«
Ответ #12 :
Мая 02, 2012, 14:34 »
Вопрос - зачем вы, trot, лезете внутрь прекрасно отлаженного механизма???
Хотя вполне могу понять желание познавать новое
Но всё же?
Записан
trot
Гость
Re: Вопрос про делегата
«
Ответ #13 :
Мая 02, 2012, 15:25 »
Одна из проблем, которая не раз обсуждалась, это не разрушение едитора (в частности combobox) при уходе фокуса с едитора. И тут начинаются трюки с фокусом.
Записан
Bepec
Гость
Re: Вопрос про делегата
«
Ответ #14 :
Мая 02, 2012, 15:42 »
Кхм. А суть этой проблемы не опишите в 2 словах?
А то я наверно или в упор игнорирую эту тему, или же слишком недавно тут,
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...