создание делегата для QTableView на основе QTextEdit |
Здравствуйте, гость ( Вход | Регистрация )
создание делегата для QTableView на основе QTextEdit |
Steklova Olga |
2.4.2012, 15:21
Сообщение
#1
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Всем привет!
У меня в БД FireBird есть следующая таблица: Хочу ее отобразить в QTableView. Оператор должен иметь возможность просмотра таблицы, а редактирование данных должно быть запрещено. Для этого мне, видимо, нужно создать делегат. Посмотрите, пожалуйста, для моего случая достаточно того, что я написала? delegate.h
delegate.cpp
mainwindow.cpp
Сообщение отредактировал Steklova Olga - 2.4.2012, 15:29 |
|
|
Litkevich Yuriy |
3.4.2012, 20:17
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Оператор должен иметь возможность просмотра таблицы, а редактирование данных должно быть запрещено. Это достигается установкой триггеров редактирования - EditTriggersЕсли же нужно ограничить редактирование определённых данных (строки или столбца) лучше сделать свою модель, которая переопределяет один единственный метод:
и для некторого(ых) индекса НЕ будет возвращать Qt::ItemIsEditable |
|
|
Steklova Olga |
3.4.2012, 21:29
Сообщение
#3
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Спасибо, Юрий, это все понятно
А в классе TextEditDelegate ничего больше не надо переопределять (если, конечно, не нужно редактирование текста)? |
|
|
Litkevich Yuriy |
4.4.2012, 11:24
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
если сделаешь свою модель, то свой делегат вообще не нужно делать, если, конечно, он не специфический.
|
|
|
Steklova Olga |
4.4.2012, 12:21
Сообщение
#5
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
И все же, если я остановлюсь на использовании моего делегата, простого до крайности, то вот этого достаточно?
Цитата если сделаешь свою модель, то свой делегат вообще не нужно делать, если, конечно, он не специфический. И как мне без использования делегата указать в модели, что при ее отображении в QTableView надо будет использовать QTextEdit?
|
|
|
wiz29 |
4.4.2012, 15:51
Сообщение
#6
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Если внутри QVariant будет строка то фабрика по умолчанию создаст делегат для строк как QLineEdit.
см. тут |
|
|
Litkevich Yuriy |
4.4.2012, 17:52
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Steklova Olga, ты про делегат не правильно понимаешь.
Коротко: Делегат - класс, объект которого создаёт представление, этот класс в обычном режиме рисует элемент данных в определённом месте представления (получая данные непосредственно из модели). Рисование элемента осуществляется в функции делегата paint(). Когда пользователь переходит в режим редактирования данных (а тебе это не нужно), представление вызывает у делегата целую пачку методов, начиная с createEditor(), которая просто создаёт виджет-редактор. Виджет-редактор - виджет, который создаётся делегатом только для редактирования данных. По завершении редактирования виджет-редактор разрушается. Поняла? П.С. Только сейчас стал понимать, в чём проблема (описаная в другой теме) в твоём делегате. Видимо ты создаёшь объект QTextEdit в качестве виджета-редактора, и ожидаешь что делегат в обычном режиме будет себя вести как QTextEdit. Хотя делегат в этом режиме самостоятельно занимается рисованием элемента на экране. |
|
|
Steklova Olga |
4.4.2012, 21:42
Сообщение
#8
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Спасибо большое, Юрий, в общих чертах поняла! Ура!
Так как представление у меня редактировать не надо, то делегата для редактирования мне не нужно, надо просто указать подходящий режим для представления: Жаль только, что он работает, по-моему, кривовато, что я предлагаю добить вот в этой теме(05.04.2012 добили, делегат все-таки понадобился для отображения, в нем переопределен метод drawDisplay) А когда мне понадобится редактировать данные в представлении, прямо на экране, то мне НЕ ПОМЕШАЕТ ПОЧИТАТЬ про делегаты подробно, а не просто бездумно списывать. wiz29, спасибо за ссылку, но для редактирования поля типа VARCHAR(1000) делегат для строк как QLineEdit не очень-то подойдет, для этого нужен QTextEdit. Потому что неудобно редактировать такой длинный текст в одной строке. Сообщение отредактировал Steklova Olga - 5.4.2012, 17:13 |
|
|
Steklova Olga |
5.4.2012, 16:28
Сообщение
#9
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
wiz29, а вот что я заметила в части использования QLineEdit в качестве делегата:
1. Если не создавать делегат вручную, но начать редактирование поля типа VARCHAR(1000), то, действительно, на экране появится QLineEdit в этой ячейке, но, если до выхода из редактирования расширить или сузить мышью окно, то ширина QLineEdit останется такой, как она была до изменения размера окна, а из под него будет видна часть многострочного текста (см рис1). 2. Если создать класс делегата, указав в createEditor установить этот делегат для колонки представления, начать редактирование поля типа VARCHAR(1000), то на экране появится QLineEdit в этой ячейке, а, если до выхода из редактирования расширить или сузить мышью окно, то ширина QLineEdit будет корректно меняться в соотв. с меняющимися размерами окна (см рис2).Получается, что 2-й вариант предпочтительнее |
|
|
Текстовая версия | Сейчас: 23.11.2024, 2:48 |