| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Отображение таблицы |
| Автор: loneybibi 14.1.2012, 16:30 |
| Доброго времени дня! В таблице есть три столбца, для отображения ее использую QSqlTableModel и QTableView. Допустим первый из них может иметь числовое значение от 1 до 3. Как сделать так чтоб для пользователя вместо цифр отображались текстовые значения? Заранее спасибо за ответы! |
| Автор: loneybibi 14.1.2012, 17:49 | ||
У меня получилось вот так с помощью делегатов:
Есть ли еще какие то варианты ? |
| Автор: loneybibi 17.1.2012, 04:47 |
| Иного приемлемого варианта как выше описанного я не нашел. Появился другой вопрос! Как узнать и передать номер или название колонки таблицы делегату? Ну или как из класса делегата узнать к какой колонке он применяется? Я думаю что нужно будет в классе QTableView переопределять функцию какую то, но какую не знаю. Или может есть другие варианты? А то не хотелось бы писать делегат для каждой колонки, а просто подставлять нужные значения в зависимости от номера или имени колонки. |
| Автор: borisbn 17.1.2012, 06:16 |
| Вообще-то это обычно решается doc.qt.nokia.com/4.8-snapshot/qsqlrelationaltablemodel.html Или doc.qt.nokia.com/4.8-snapshot/qsqlrelationaldelegate.html |
| Автор: loneybibi 17.1.2012, 06:49 |
| Да я как бы уже о другом с QSqlRelationTableModel все понятно. Мне нужно знать к индекс ячейки в таблице конкретно к которой сейчас применяется делегат. Вот в методе "QStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const" есть index у которого есть свойство column. Но как его передать в метод displayText или где его взять внутри метода displayText ? |
| Автор: spyswamp 17.1.2012, 17:23 | ||||
Все же просто:
Только твой делегат нужно поправить так:
Таким образом, если ты создаешь именно делегата для колонки, то и будешь записывать в него колонку. Для строк есть функция установки делегата QAbstractItemView::setItemDelegateForRow(). А вот для делегатов ячеек уже придется извращаться. Но, как я понял, вариант для колонок тебя вполне устроит. |
| Автор: loneybibi 17.1.2012, 17:32 |
| Да так то понятно если делать таким способом то и проблем то не возникает. Но это надо для каждой колонки назначать делегат и отправлять ему номер колонки к которой он применяется. А если делать так: QTableView::setItemDelegate(new mDelegate); т.е. назначить один делегат сразу для всех колонок, а уже потом внутри самого класса делегата разбираться к чему он там применяется и тд. Почти так же так как описано вами я и сделал сейчас, все работает, но это как промежуточный вариант. Но на мой взгляд это чуток не правильно что ли... Должен же быть в QStyleItemDelegate метод чтоб узнать к какой ячейке он относится и в методе paint он есть. Но в методе displayText я его не нашел. А мне то и надо всего сменить текст отображения при определенном числовом значении ячейки в зависимости от номера колонки. |
| Автор: spyswamp 17.1.2012, 17:38 |
| Дело в том, что для этих вещей displayText() никак не подходит, потому что эта функция вызывается для роли модели Qt::DisplayRole. Тебе требуется перезагрузить setModelData(). Поиграйся с ней - она и модель знает, и индекс. |
| Автор: spyswamp 17.1.2012, 18:46 |
| Кстати, еще такая ситуация: можешь использовать свою модель. Отнаследуй ее от используемой и перезагрузи функцию data(). Будешь там выводить то, что тебе надо на Qt::DisplayRole. |
| Автор: loneybibi 17.1.2012, 18:56 | ||
Попробовал в методе paint! Вроде все то что надо получилось но вот рисует он текст не так как это делает таблица а чуть выше и левее (рисунок ниже прикрепил), хотя rect передал. Кто подскажет как это исправить?
Попробую поиграть с setDataModel. >_< |
| Автор: loneybibi 17.1.2012, 19:16 | ||
Дело в том что setModelData вызывается после редактирования ячейки. Поэтому это не подходит. (( |
| Автор: spyswamp 17.1.2012, 19:21 |
| Тогда я за "отвиртуаливание" функции data() у модели для нужной роли. Делать такую логику в paint() - это, по-моему, полная жесть. Добавлено через 59 секунд Модель - ЧТО отобразить. Делегат - КАК отобразить, КАК изменить. У тебя, есть подозрение, эти понятия попутались слегка. |
| Автор: loneybibi 18.1.2012, 04:06 |
| Если бы все дело было в sql было бы проще. Вопрос собственно о делегате ячейки. Предположим что данные берутся не из БД а из файла и заполняется таблица. |
| Автор: spyswamp 18.1.2012, 14:16 |
| Модель пиши. |
| Автор: loneybibi 18.1.2012, 16:44 | ||
Неее хочу ! |