Russian Qt Forum

Qt => Model-View (MV) => Тема начата: ManOfOrange от Январь 13, 2011, 01:35



Название: Покраска ячеек в QTableView
Отправлено: ManOfOrange от Январь 13, 2011, 01:35
Здравствуйте, господа! :-)

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

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

Не подскажете ли чего?


Название: Re: Покраска ячеек в QTableView
Отправлено: Пантер от Январь 13, 2011, 08:18
Цитировать
Пробовал кажущиеся логичными способы, найденные в том числе и на этом форуме
Это какие именно? По какому принципу раскрашивать будешь? Вообще, делегаты для этого и сделаны.


Название: Re: Покраска ячеек в QTableView
Отправлено: sadhu от Январь 13, 2011, 18:56
Если не переопределял у делегата метод paint, то вполне можешь сделать прокси модель с переопределённым методом data() который на основе данных исходной модели возвращает нужный цвет для роли Qt::BackgroundColorRole.


Название: Re: Покраска ячеек в QTableView
Отправлено: inri13666 от Март 06, 2011, 20:57
и я так понимаю setItemdata & setData как раз для этого но у меня не получается сразу раскрасить ячейку если для QTableView как модель используется QSqlQueryModel они всегда чёто возвращают false =((

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

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

зеркало аттачей =) (https://bitbucket.org/inri13666/qt_tests/downloads)


Название: Re: Покраска ячеек в QTableView
Отправлено: FireSnake от Март 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 создал для переопределения прорисовки текста

вот я столкнулся с задачей посложнее) как мне поставить картинку, ну или хотя бы покрасить ячейку, отредактированную с помощью делегата


Название: Re: Покраска ячеек в QTableView
Отправлено: alexman от Март 09, 2011, 00:22
Используй метод bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ). Роль Qt::BackgroundRole.


Название: Re: Покраска ячеек в QTableView
Отправлено: FireSnake от Март 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);
}
но чето оно не пашет( че я делаю не так?


Название: Re: Покраска ячеек в QTableView
Отправлено: FireSnake от Март 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);
}


Название: Re: Покраска ячеек в QTableView
Отправлено: alexman от Март 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 для своей модели!


Название: Re: Покраска ячеек в QTableView
Отправлено: FireSnake от Март 09, 2011, 09:22
Так в том и проблема что QSqlTableModel игнорирует все кроме Qt::EditRole и Qt::DisplayRole


Название: Re: Покраска ячеек в QTableView
Отправлено: alexman от Март 09, 2011, 10:08
Так в том и проблема что QSqlTableModel игнорирует все кроме Qt::EditRole и Qt::DisplayRole
Не проверял действительно ли это так ??? Если так то можно хранить кеш и переопределить методы setData - обновление кеша, data - полученеи данных из кеша или data по умолчанию...