Russian Qt Forum
Ноябрь 23, 2024, 19:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Покраска ячеек в QTableView  (Прочитано 9709 раз)
ManOfOrange
Гость
« : Январь 13, 2011, 01:35 »

Здравствуйте, господа! :-)

Есть компонент, унаследованный от QFrame и имеющий в себе помимо прочего QTableView. Там же кучка собственных делегатов, унаследованных от QItemDelegate.
К QTableView цепляется модель QSqlTableModel.
Возможности написать свою модель нет.

Есть задача выставлять ячейкам цвет фона. Пробовал кажущиеся логичными способы, найденные в том числе и на этом форуме, но ни один не заработал.

Не подскажете ли чего?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 13, 2011, 08:18 »

Цитировать
Пробовал кажущиеся логичными способы, найденные в том числе и на этом форуме
Это какие именно? По какому принципу раскрашивать будешь? Вообще, делегаты для этого и сделаны.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
sadhu
Гость
« Ответ #2 : Январь 13, 2011, 18:56 »

Если не переопределял у делегата метод paint, то вполне можешь сделать прокси модель с переопределённым методом data() который на основе данных исходной модели возвращает нужный цвет для роли Qt::BackgroundColorRole.
Записан
inri13666
Гость
« Ответ #3 : Март 06, 2011, 20:57 »

и я так понимаю setItemdata & setData как раз для этого но у меня не получается сразу раскрасить ячейку если для QTableView как модель используется QSqlQueryModel они всегда чёто возвращают false =((

но вот если юзать просто QStandardItemModel как модель для QTableView то всё ок =))

пример в аттаче

зеркало аттачей =)
« Последнее редактирование: Март 06, 2011, 22:23 от inri13666 » Записан
FireSnake
Гость
« Ответ #4 : Март 09, 2011, 00:18 »

А что надо ? тупо покрасить ячейки?
я переопределил paint в своем делегате и покрасил вот так
Код:
void SpinBoxDelegate::paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
  {

    QString text = index.model()->data(index, Qt::DisplayRole).toString();

    QRect rect = option.rect;
    QLinearGradient gradient(0,0, rect.width(), rect.height());
    gradient.setColorAt(0, Qt::white);
    gradient.setColorAt(0.5, Qt::blue);
    gradient.setColorAt(1, Qt::green);
    painter->setBrush(gradient);
    painter->drawRect(rect);
    QStyleOptionViewItem newOptions = option;
    newOptions.font.setPixelSize(48);

    QItemDelegate::paint(painter, option, index);

  }
newOptions создал для переопределения прорисовки текста

вот я столкнулся с задачей посложнее) как мне поставить картинку, ну или хотя бы покрасить ячейку, отредактированную с помощью делегата
Записан
alexman
Гость
« Ответ #5 : Март 09, 2011, 00:22 »

Используй метод bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ). Роль Qt::BackgroundRole.
Записан
FireSnake
Гость
« Ответ #6 : Март 09, 2011, 01:47 »

т.е. как вариант сделать свою модель на основе QSqlTableModel и переопределить метод setData?
я сделал что то вроде того
Код:
bool MySqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role){
    QAbstractItemModel::setData(index, Qt::black, Qt::BackgroundRole);
    return QSqlTableModel::setData(index, value, role);
}
но чето оно не пашет( че я делаю не так?
Записан
FireSnake
Гость
« Ответ #7 : Март 09, 2011, 01:59 »

ну да еще один способ покрасить ячейки попроще как было сказано ранее через прокси модель с переопределенным data, ну я просто сделал модель на основе QSqlTableModel
Код:
QVariant MySqlTableModel::data(const QModelIndex &idx, int role) const{
    switch(role){
        case Qt::BackgroundRole:
        return Qt::black;

    }
    return  QSqlTableModel::data(idx, role);
}
Записан
alexman
Гость
« Ответ #8 : Март 09, 2011, 08:55 »

т.е. как вариант сделать свою модель на основе QSqlTableModel и переопределить метод setData?
я сделал что то вроде того
Код:
bool MySqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role){
    QAbstractItemModel::setData(index, Qt::black, Qt::BackgroundRole);
    return QSqlTableModel::setData(index, value, role);
}
но чето оно не пашет( че я делаю не так?
Не надо переопределять! Просто вызвать setData для своей модели!
Записан
FireSnake
Гость
« Ответ #9 : Март 09, 2011, 09:22 »

Так в том и проблема что QSqlTableModel игнорирует все кроме Qt::EditRole и Qt::DisplayRole
Записан
alexman
Гость
« Ответ #10 : Март 09, 2011, 10:08 »

Так в том и проблема что QSqlTableModel игнорирует все кроме Qt::EditRole и Qt::DisplayRole
Не проверял действительно ли это так Непонимающий Если так то можно хранить кеш и переопределить методы setData - обновление кеша, data - полученеи данных из кеша или data по умолчанию...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.238 секунд. Запросов: 23.