| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT] Как раскрасить строки QListView |
| Автор: Brodyaga 19.1.2010, 23:18 |
| Всем доброго времени суток! Мне нужно закрасить фон некоторых строк в QListView определённым цветом. Поделитесь опытом кто делал такое? P.S. Отображаемые данные находятся под управлением модели основанной на QAbstractListItem, может в этом направлении нужно копать? |
| Автор: chaos 20.1.2010, 08:30 |
| Brodyaga, не помню кто-то тут сказал: "Делегаты наше все" |
| Автор: sergey_85 20.1.2010, 09:10 | ||
| Привет! Попробуй использовать QItemDelegate, переопредели метод void QItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const [virtual]
Можно глянуть Qt пример Qt Examples SpinBox Delegate |
| Автор: Brodyaga 20.1.2010, 11:54 |
| Мне нужно раскрасить строку не в момент редактирования и не при проводе мышкой над строкой, а при выполнении условий определённых. Как мне сделать так, чтобы метод paint вызвался для всех индексов в модели? в какой момент он вообще вызывается? |
| Автор: chaos 20.1.2010, 16:13 | ||||
пока еще не было задач по реализации своего делегата, но следуя логике: 1. метод paint вызовется для всех видимых item'ов 2. вызывается метод paint тогда, когда необходимо показать item'ы + принудительно Добавлено через 13 минут и 14 секунд если только так, то что мешает заюзать QTableWidget ? Наполняем его QTableWidgetItem и при каких хотите условиях у item'а меняете фон
|
| Автор: chaos 20.1.2010, 16:28 |
| поторопился - последний предложенный способ будет работать "как надо" в случае 1го столбца иначе придется извращаться - всем item'ам с row = N менять цвет |
| Автор: Brodyaga 20.1.2010, 17:01 | ||
Тем, что у меня есть объекты для наполнения свои, и использую я QListView, так как колонка всегда одна. |
| Автор: chaos 20.1.2010, 17:08 | ||
| вывод не ясен. не знал бы я про то что можно заюзать "MVC" то сделал бы так
|
| Автор: KADABRA 20.1.2010, 19:16 | ||||||
| Зачем так всё усложнять? Приведённое мной решение позволяет в две строки решить эту задачу.
В этой модели, в методе
пишем
|
| Автор: Brodyaga 20.1.2010, 19:31 | ||
Придёться немного углубиться в задачу... Дело в том, что подсвечивать я хочу те строки, на которые можно перетащить объект из другого QListView... Следовательно, подсветка всегда у разных строк бывает. Как мне это в методе data предусмотреть? |
| Автор: KADABRA 20.1.2010, 20:43 | ||
Brodyaga,
Для тех что не надо подсвечивать возвращать пустой QVariant() |
| Автор: Brodyaga 20.1.2010, 21:19 | ||
Да нет.. как мне в методе дата узнать надо подсвечиват или не надо заранее? Где мне сохранить объект перетаскиваемый, чтобы исследовать его на предмет того, подсвечивать ли определённую строку или нет? |
| Автор: KADABRA 20.1.2010, 21:47 | ||
Brodyaga,
А зачем заранее? В момент начала перетаскивания расчитайте что и как подсвечивать (или передайте модели что перетаскиваете, чтоб прямо в data считать), можно в модели метод создать onDragHighlight, и сделайте из модели emit dataChanged или layoutChanged. |
| Автор: Brodyaga 21.1.2010, 13:07 | ||||||||
В момент начала перетаскивания это и есть заранее Сделал специальный сигнал, но не могу его вызвать в методе, который вызывается в момент начала перетаскивания:
Выдаёт ошибку:
Из константного метода нельзя чтоли сигнал эммитить? Исправил этим
|
| Автор: KADABRA 21.1.2010, 13:42 |
| Brodyaga, "Эммитить сигнал" это просто вызывать сгенерированный moc'ом метод, который не константный. Соответсвтенно нельзя. |