![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
JuryS1806 |
![]()
Сообщение
#1
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет !
Здорово работать с QTableView при помощи делегатов, но вот такая незадача, например, я могу установить делегат для столбца или строки таблицы, а как присвить его конкретному индексу. В MS Access это делается очень легко и непринужденно, а здесь я так понял можно только через setIndexWidget и созданный Widget подцеплять к четырем слотам, вместо простоейшего использования ItemDelegate. В справке нашел: Note: If a delegate has been assigned to both a row and a column, the row delegate (i.e., this delegate) will take presedence and manage the intersecting cell index. т.е. как бы если назначить делегат для строки и столбца, будет работать в ячейки пересечения, но почему то он работает и по гориз и по верт. Спасибо заранее за помощь ! P.S. Any existing row delegate for row will be removed, but not deleted. QAbstractItemView does not take ownership of delegate. т.е. опять memory leaks ? |
|
|
![]() |
igor_bogomolov |
![]()
Сообщение
#2
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Note: If a delegate has been assigned to both a row and a column, the row delegate (i.e., this delegate) will take presedence and manage the intersecting cell index. Тут опечатка в документации. Должно быть precedence. Т.е. если делегат был назначен как для строки так и для колонки, то приоритет будет иметь делегат строки, который будет управлять пересекающейся ячейкой.Для конкретной ячейки делегат установить нельзя. У меня на такой случай есть "обобщенный делегат". Т.е. делегат который имеет множество представлений по редактированию. Я в Qt::UserRole выставляю тип делегата, и зависимости от этого типа, делегат ведет себя по разному, тем самым имитируя "делегат для яцейки" |
|
|
JuryS1806 |
![]()
Сообщение
#3
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо за ответ. Я вот вчера к утру додумал к следующему:
нужно создавать делегат для конкретного колумна, например:
я так понимаю, стандартным является QLineEdit. Вообще, если честно я собрал для себя коллекцию разных делегатов, искал через инет, изобретал и как результат, имею все элементы управления MS Access 2007, календарики, чекбоксы, выпадающие таблицы, списки и т.д. и т.п. И теперь работать одно удовольствие со своей моделью и делегатами! Qt очень крутая система! |
|
|
igor_bogomolov |
![]()
Сообщение
#4
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Можно конечно и так, каждый сам для себя решает, вот только это не универсально, т.к. к другой таблице ты этот делегат не применишь.
А вот если ты сделаешь примерно так получишь делигат применимый к любой таблице, всё что надо будет сделать, проинициализировать UserRole
|
|
|
JuryS1806 |
![]()
Сообщение
#5
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Нет, тоже не вариант. Если до этого какой-нибудь ячейке был назначен делегат, он перепишется новым.
Игорь, я так понял что нужно создать универсальный делегат для строки со всеми необходимыми вариантами??? Это очень много кода... А может быть все таки более простые и красивые решения ? Прикрепил скриншот того что хочу воспроизвести, т.е. в каждой строки таблицы в зависимости от выбранного типа (столбец "Тип") меняются делегаты для "Умолч","Мин","Макс". Спасибо за любое участие в решении проблемы Сообщение отредактировал JuryS1806 - 22.1.2011, 0:16
Эскизы прикрепленных изображений
|
|
|
igor_bogomolov |
![]()
Сообщение
#6
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Нет, тоже не вариант. Если до этого какой-нибудь ячейке был назначен делегат, он перепишется новым. Это ограничение легко обходится. Не нужно относиться к коду так буквально, я всего лишь хотел продемонстрировать идею.я так понял что нужно создать универсальный делегат для строки со всеми необходимыми вариантами??? Как ты его будешь использовать, это не важно. Хочешь для строки выставляй, хочешь для столбца, да хоть для всей таблици целиком. Способ редактирования будет такой как ты укажешь в UserRole. Главное не забывать его задавать для каждой ячейки.Это очень много кода... А может быть все таки более простые и красивые решения ? Да, что поделаешь, кода действительно чуть больше чем для обычного делегата. Зависит от того, сколько способов для редактирования ты хочешь иметь. Другого способа задавать делегаты для отдельной ячейки я не знаю.
|
|
|
JuryS1806 |
![]()
Сообщение
#7
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
И на том спасибо. Просто боюсь костыли приделывать в своей программе. Сейчас покопаю QAbstractItemView исходники, может унаследоваться от него или Qt пересоберу с изменениями какими. Уж больно не нравится мне использовать Qt::UserRole.
Ведь все равно при использовании setItemDelegateForColumn(), setItemDelegateForRow() назначаются на самом деле делегаты для конкретных ячеек, просто это сокращенное решение от тролей, такая юзерфильная хрень |
|
|
igor_bogomolov |
![]()
Сообщение
#8
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Просто боюсь костыли приделывать в своей программе. Лично я это костылем не считаю. На мой взгляд - это нормальное, грамотное решение.Qt пересоберу с изменениями какими Вот это еще больший костыль будет, намучаетесь. К тому же эти изменения придётся открыть.Сейчас покопаю QAbstractItemView исходники Ну удачи, если что получится отпишись. Я, правда, в своё время, там решения не углядел (правда и не старался так уж сильно)
|
|
|
JuryS1806 |
![]()
Сообщение
#9
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Да. это и вправду лучшее решение сейчас. только до меня дошло.
т.е. я могу например сделать следующее: 1. для каждой строки таблицы назначать всегда делегат. 2. далее считывать data(index,Qt::UserRole) 3. если будет 0, тогда QLineEdit 4. если будте 1, тогда IntDelegate RealDelegate MoneyDelegate и т.д. Я правильно понял мысль, т.е. до меня это так дошло ? И все таки как выглядит дефолтный делегат. Это есть обычный QLineEdit ? |
|
|
igor_bogomolov |
![]()
Сообщение
#10
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
JuryS1806 |
![]()
Сообщение
#11
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
вот и простейший делегат от тролей: QSqlRelationalDelegate
можно назначить делегат не для каждой строки, а для все таблицы. Только вот когда вызывается CreateEditor? Каждый раз при вхождении в ячейку? Соответственно делегат нужно запихнуть в приватную секцию и добавить на него несколько Update'ов... Вообщем, все делегаты нужно объединить в один и ПОЛОВИНУ ПРОГРАММЫ переписывать заново ! Пойду застрелюсь БЛИН! |
|
|
igor_bogomolov |
![]()
Сообщение
#12
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Вообщем, все делегаты нужно объединить в один и ПОЛОВИНУ ПРОГРАММЫ переписывать заново ! Не нужно так сгущать краски. Нет там ничего сложного, тем более что отдельные делегаты уже есть. В остальном коде изменений будет самый минимум.Пойду застрелюсь БЛИН! Только вот когда вызывается CreateEditor? Это устанавливает void QAbstractItemView:setEditTriggers ( EditTriggers triggers ). Если писали другие делегаты, то должны бы это знать.Соответственно делегат нужно запихнуть в приватную секцию и добавить на него несколько Update'ов... Не понятная какая то фраза. Каких еще update, зачем?
|
|
|
JuryS1806 |
![]()
Сообщение
#13
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Вообщем, приблизительно сделал так:
delegate.h : Раскрывающийся текст
delegate.cpp : Раскрывающийся текст
Работает неплохо, при этом можно назначить делегат для ячейки или целого столбца. Один минус - не могу прорисовать делегат в неактивном состоянии. Вылетает программа, try ... catch не спасает. Поэтому например при прорисовке чекбокса в неактивном состоянии получаю просто текст Да или Нет, а сам флажок можно установить при редакции ячейки. В целом нормально... |
|
|
JuryS1806 |
![]()
Сообщение
#14
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Еще массу наработок сделал. Если кому нужно, пишите.
И такой вопрос. А как все таки в комбобокс засунуть таблицу ? И еще я при работе в Linux получаю комбо бокс, у которого размер выпадающего списка соответствует размеру содержимого текста, а в Windows ставятся троеточия по середине текста. Решил проблему под Windows приблизительно так:
Но все таки думаю может быть фирменное решение этого вопроса есть. И ведь в Linux почему-то на автомате списки нормально отображаются, значит в винде их как-то залочили ???? |
|
|
dragomir |
![]()
Сообщение
#15
|
Новичок Группа: Новичок Сообщений: 1 Регистрация: 20.11.2011 Пользователь №: 3014 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Заранее извиняюсь.
Надо срочно использовать описанный здесь делегат - очень подходящее решение, которое мне нужно в курсовой. Может кто нибудь привести пример реализации - код таблицы, в которой будут использоваться реализованные возможности? |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 15.7.2025, 21:15 |