Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT] Как раскрасить строки QListView 
:(
    Опции темы
Brodyaga
Дата 19.1.2010, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Всем доброго времени суток!
Мне нужно закрасить фон некоторых строк в QListView определённым цветом. Поделитесь опытом кто делал такое?

P.S.
Отображаемые данные находятся под управлением модели основанной на QAbstractListItem, может в этом направлении нужно копать?
PM MAIL   Вверх
KADABRA
Дата 19.1.2010, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.8.2007

Репутация: 2
Всего: 3



Brodyaga, 
Цитата(Brodyaga @  19.1.2010,  23:18 Найти цитируемый пост)
Отображаемые данные находятся под управлением модели основанной на QAbstractListItem, может в этом направлении нужно копать? 

Тогда просто, в переопределённом методе
QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
для параметра role == Qt::BackgroundColorRole возвращаем нужный цвет.
PM MAIL   Вверх
chaos
Дата 20.1.2010, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Brodyaga, не помню кто-то тут сказал: "Делегаты наше все"
PM WWW   Вверх
sergey_85
Дата 20.1.2010, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Привет!

Попробуй использовать QItemDelegate, переопредели метод 
void QItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const   [virtual]

Код

void QItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const   [virtual]
Renders the delegate using the given painter and style option for the item specified by index.
When reimplementing this function in a subclass, you should update the area held by the option's rect variable, using the option's state variable to determine the state of the item to be displayed, and adjust the way it is painted accordingly.
For example, a selected item may need to be displayed differently to unselected items, as shown in the following code:
     if (option.state & QStyle::State_Selected)
         painter->fillRect(option.rect, option.palette.highlight());

     int size = qMin(option.rect.width(), option.rect.height());
     int brightness = index.model()->data(index, Qt::DisplayRole).toInt();
     double radius = (size/2.0) - (brightness/255.0 * size/2.0);
     if (radius == 0.0)
         return;

     painter->save();
     painter->setRenderHint(QPainter::Antialiasing, true);
     painter->setPen(Qt::NoPen);
     if (option.state & QStyle::State_Selected)
         painter->setBrush(option.palette.highlightedText());
     else
     ...
After painting, you should ensure that the painter is returned to its the state it was supplied in when this function was called. For example, it may be useful to call QPainter::save() before painting and QPainter::restore() afterwards.
Reimplemented from QAbstractItemDelegate.
See also QStyle::State.



Можно глянуть Qt пример Qt Examples SpinBox Delegate

 smile 

Это сообщение отредактировал(а) sergey_85 - 20.1.2010, 09:12


--------------------
A good design always pays off.
PM MAIL   Вверх
Brodyaga
Дата 20.1.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Мне нужно раскрасить строку не в момент редактирования и не при проводе мышкой над строкой, а при выполнении условий определённых. Как мне сделать так, чтобы метод paint вызвался для всех индексов в модели? в какой момент он вообще вызывается?
PM MAIL   Вверх
chaos
Дата 20.1.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Цитата(Brodyaga @ 20.1.2010,  08:54)
Мне нужно раскрасить строку не в момент редактирования и не при проводе мышкой над строкой, а при выполнении условий определённых. Как мне сделать так, чтобы метод paint вызвался для всех индексов в модели? в какой момент он вообще вызывается?

пока еще не было задач по реализации своего делегата, но следуя логике:

1. метод paint вызовется для всех видимых item'ов
2. вызывается метод paint тогда, когда необходимо показать item'ы + принудительно

Добавлено через 13 минут и 14 секунд
Цитата(Brodyaga @  19.1.2010,  20:18 Найти цитируемый пост)
закрасить фон некоторых строк

если только так, то что мешает заюзать QTableWidget ?
Наполняем его QTableWidgetItem и при каких хотите условиях у item'а меняете фон 

Код

QTableWidgetItem::setData(Qt::BackgroundColorRole, QColor);

PM WWW   Вверх
chaos
Дата 20.1.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



поторопился - последний предложенный способ будет работать "как надо" в случае 1го столбца иначе придется извращаться - всем item'ам с row = N менять цвет
PM WWW   Вверх
Brodyaga
Дата 20.1.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

если только так, то что мешает заюзать QTableWidget ?
Наполняем его QTableWidgetItem и при каких хотите условиях у item'а меняете фон 

Тем, что у меня есть объекты для наполнения свои, и использую я QListView, так как колонка всегда одна.
PM MAIL   Вверх
chaos
Дата 20.1.2010, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Цитата(Brodyaga @  20.1.2010,  14:01 Найти цитируемый пост)
и использую я QListView, так как колонка всегда одна
 вывод не ясен.


Цитата(Brodyaga @  20.1.2010,  14:01 Найти цитируемый пост)
Тем, что у меня есть объекты для наполнения свои

не знал бы я про то что можно заюзать "MVC" 
то сделал бы так
Код

ui->tableWidget->setRowCount(SomeObjectArray.count());
int n = 0;
foreach(SomeObject *obj, SomeObjectArray) {
    QTableWindgetItem *item = new QTableWidgetItem("blablabla");
    item->setData(Qt::User, obj);
    ui->tableWidget->setItem(item, n++, 0);
}




Это сообщение отредактировал(а) chaos - 20.1.2010, 17:10
PM WWW   Вверх
KADABRA
Дата 20.1.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.8.2007

Репутация: 2
Всего: 3



Зачем так всё усложнять?
Приведённое мной решение позволяет в две строки решить эту задачу.
Цитата(Brodyaga @  19.1.2010,  23:18 Найти цитируемый пост)

Отображаемые данные находятся под управлением модели основанной на QAbstractListItem, может в этом направлении нужно копать? 

В этой модели, в методе
Код

QVariant data ( const QModelIndex & index, int role ) const

пишем
Код

    if(role == Qt::BackgroundColorRole)
        return QVariant(QColor(qrand() % 255, qrand() % 255, qrand() % 255));    // или цвет, какой нужен

PM MAIL   Вверх
Brodyaga
Дата 20.1.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

Зачем так всё усложнять?
Приведённое мной решение позволяет в две строки решить эту задачу.

Придёться немного углубиться в задачу...
Дело в том, что подсвечивать я хочу те строки, на которые можно перетащить объект из другого QListView...
Следовательно, подсветка всегда у разных строк бывает. Как мне это в методе data предусмотреть?
PM MAIL   Вверх
KADABRA
Дата 20.1.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.8.2007

Репутация: 2
Всего: 3



Brodyaga, 
Цитата(Brodyaga @  20.1.2010,  19:31 Найти цитируемый пост)
Следовательно, подсветка всегда у разных строк бывает. Как мне это в методе data предусмотреть? 

Для тех что не надо подсвечивать возвращать пустой QVariant()
PM MAIL   Вверх
Brodyaga
Дата 20.1.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

Для тех что не надо подсвечивать возвращать пустой QVariant()


Да нет.. как мне в методе дата узнать надо подсвечиват или не надо заранее? Где мне сохранить объект перетаскиваемый, чтобы исследовать его на предмет того, подсвечивать ли определённую строку или нет?
PM MAIL   Вверх
KADABRA
Дата 20.1.2010, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.8.2007

Репутация: 2
Всего: 3



Brodyaga, 
Цитата(Brodyaga @  20.1.2010,  21:19 Найти цитируемый пост)
как мне в методе дата узнать надо подсвечиват или не надо заранее?

А зачем заранее? В момент начала перетаскивания расчитайте что и как подсвечивать (или передайте модели что перетаскиваете, чтоб прямо в data считать), можно в модели метод создать onDragHighlight, и сделайте из модели emit dataChanged или layoutChanged.
PM MAIL   Вверх
Brodyaga
Дата 21.1.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

А зачем заранее? В момент начала перетаскивания расчитайте что и как подсвечивать (или передайте модели что перетаскиваете, чтоб прямо в data считать), можно в модели метод создать onDragHighlight, и сделайте из модели emit dataChanged или layoutChanged.

В момент начала перетаскивания это и есть заранее smile 

Сделал специальный сигнал, но не могу его вызвать в методе, который вызывается в момент начала перетаскивания:
Код

QMimeData* MyModel::mimeData(const QModelIndexList &indexes) const
{
 ...
 emit signalDragIndex(index);
 ...
}


Выдаёт ошибку:
Код

Error    1    error C2662: 'MyModel::signalDragIndex' : cannot convert 'this' pointer from 'const MyModel' to 'MyModel &'


Из константного метода нельзя чтоли сигнал эммитить?

Исправил этим

Код

emit const_cast<MyModel*>(this)->signalDragIndex(index);


smile))))

Это сообщение отредактировал(а) Brodyaga - 21.1.2010, 13:41
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.