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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [4.2.2] Не могу закрасить ячейку у QTableView  (Прочитано 15205 раз)
Mike
Гость
« : Март 02, 2007, 09:39 »

Сделал делегат для QTableView. В нем пишу:
Код:
void cStyleDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex& index) const
{
if (index.isValid())
{
const QAbstractItemModel* model = index.model();
int row = index.row();

QPalette p(option.palette);
QColor FontColor(model->data(model->index(row, 3)).toUInt());
QColor BackColor(model->data(model->index(row, 4)).toUInt());
p.setColor(QPalette::Text, FontColor);
p.setColor(QPalette::Base, BackColor);
p.setColor(QPalette::HighlightedText, FontColor);
p.setColor(QPalette::Highlight, BackColor);

QStyleOptionViewItem opt(option);
opt.palette = p;

QItemDelegate::paint(painter, opt, index);
}
}

Цвет шрифта меняется. Цвет фона меняется только для выделенной ячейки. Почему не работает p.setColor(QPalette::Base, BackColor);?
Записан
vregess
Гость
« Ответ #1 : Март 02, 2007, 20:23 »

Как вариант можно попробывать изменять цвет ячейки из модели.
Код:

QVariant YModel::data(const QModelIndex &index, int role) const
{
  if(role==Qt::BackgroundColorRole){
    return QColor(Qt::red);
  }
}


Еще можно непосредственно при создании итема указать цвет фона
Код:

void QTableWidgetItem::setBackgroundColor ( const QColor & color )


А так как ты сделал, в смысле по такой же технологии, у меня тоже пока не получилось. Сам голову ломаю как сделать.
У кого-нибудь вообще получалось?
Зашел на форум с этим вопросом, а ты уже его задал...
Записан
Alexei
Гость
« Ответ #2 : Март 02, 2007, 21:24 »

Цвет фона задается ролью Qt::BackgroundRole у элемента модели, поэтому QPalette::Base не влияет на отрисовку фона.
Записан
vregess
Гость
« Ответ #3 : Март 03, 2007, 07:24 »

Цитата: "Alexei"
Цвет фона задается ролью Qt::BackgroundRole у элемента модели, поэтому QPalette::Base не влияет на отрисовку фона.


Так ведь и шрифт задается ролью Qt::FontRole, но в делегате его можно поменять. В доке написано, что

Цитировать

Qt::FontRole - The font used for items rendered with the default delegate.
Qt::BackgroundColorRole - The background color used for items rendered with the default delegate.


Т.е. это относится к default delegate.

Шрифт то можно поменять из своего делегата, а цвет фона - не получается. Вот и непонятно...
Записан
Alexei
Гость
« Ответ #4 : Март 03, 2007, 08:16 »

QItemDelegate::paint вызывает drawBackground для отрисовки фона.
Посмотри реализацию drawBackground ($QTDIR\src\gui\itemviews\qitemdelegate.cpp) и станет все ясно.
Версия 4.2.2.
Записан
vregess
Гость
« Ответ #5 : Март 03, 2007, 09:53 »

Цитата: "Alexei"
QItemDelegate::paint вызывает drawBackground для отрисовки фона.
Посмотри реализацию drawBackground ($QTDIR\src\gui\itemviews\qitemdelegate.cpp) и станет все ясно.
Версия 4.2.2.


действительно... посмотрел. понял.

Код:

    // draw the background color
    if (option.showDecorationSelected && (option.state & QStyle::State_Selected)) {
        QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
                                  ? QPalette::Normal : QPalette::Disabled;
        if (cg == QPalette::Normal && !(option.state & QStyle::State_Active))
            cg = QPalette::Inactive;
        painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight));
    } else {
        value = index.data(Qt::BackgroundColorRole);
        if (value.isValid() && qvariant_cast<QColor>(value).isValid())
            painter->fillRect(option.rect, qvariant_cast<QColor>(value));
    }

Получается, что если модель возвращает не валидный результат, то
делегат ничего не делает, иначе - красит в указанный цвет.

Пока нашел такой выход (на примере QTableWidget):

При создании итема указываем дефолтный QVariant:
Код:

QTableWidgetItem *item=new QTableWidgetItem("bla-bla");
item->setData(Qt::BackgroundColorRole,QVariant());

Далее создаем простенький делегат и переопределяем метод paint:
Код:

void MDTDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                                         const QModelIndex &index) const
{
        if(!index.data(Qt::BackgroundColorRole).isValid())
                painter->fillRect(option.rect, QColor(Qt::red));
        QItemDelegate::paint(painter,option,index);
}


Ну в общем такая примерно технология...
Записан
Alexei
Гость
« Ответ #6 : Март 04, 2007, 12:51 »

Если цвет фона зависит от элемента модели, а не от момента его отрисовки, то нет смысла переопределять метод paint делегата: достаточно задать цвет элемента:
item->setData(Qt::BackgroundColor, Qt::red)

Также не обязательно использовать QTableWidget и QTableWidgetItem, если в этом нет необходимости. Если у тебя своя модель данных, то при ее заполнении нужно задать цвет фона для каждого элемента. В этом случае достаточно QTableView вместо QTableWidget.
Записан
FantasyOR
Гость
« Ответ #7 : Июль 16, 2010, 13:29 »

все одно не понял В замешательстве
если я создаю свою модель от QAbstractTableModel, естественно переопределяю "QVariant data(const QModelIndex &index, int role ) const;", то какую роль нужно отлавливать и что возвращать? я делаю так:

Код:
   if (role == Qt::BackgroundRole)
  {
QBrush b;
b.setColor(Qt::yellow);
b.setStyle(Qt::SolidPattern);
res = b;
   }
return res;

фон ячейки не изменяется.
пожалуйста помогите, не надо слов, дайте народу код.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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