Russian Qt Forum

Qt => Model-View (MV) => Тема начата: stealth от Август 17, 2007, 23:04



Название: Пример делегата для закраски фона ячейки
Отправлено: stealth от Август 17, 2007, 23:04
Доброго времени суток!
Обыскался сабжа, но так ничего рабочего и не нашел.
Нужен простой пример закраски ячейки например в красный цвет.
Спасибо!


Название: Пример делегата для закраски фона ячейки
Отправлено: SABROG от Август 18, 2007, 09:04
Версия Qt.

Нужен именно делегат или стандартные способы тоже прокатят, типа этого ?

Код:

void QStandardItem::setBackground ( const QBrush & brush )


Название: Пример делегата для закраски фона ячейки
Отправлено: Gryz от Август 18, 2007, 09:56
Еще вариант.
Наследуешься от QItemDelegate
и переопределяешь:

void drawBackground ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const.

В option содержатся всяческие данные, описывающие параметры для отрисовки элемента


Название: Re: Пример делегата для закраски фона ячейки
Отправлено: stealth от Август 20, 2007, 10:14
Нужно именно через делегата.
void drawBackground ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const.
про него я в курсе, на него впринципе пример и ищу. Все мои попытки сделать что-то через него не проходят. Находил через гугл пример реализации подсветки в редакторе Kate, но что-то тоже не заработало на ячейках.


Название: Re: Пример делегата для закраски фона ячейки
Отправлено: denka от Август 20, 2007, 10:34
Попробуй возвращать нужный цвет моделью. То есть у тебя индекс модели должен возвращать QBrush на:
 index.data(Qt::BackgroundRole);
Именно это значение запрашивает QItemDelegate::drawBackground если элеммент не выделен. Если не подойдет такое поведение делегата то тогда дейтсвительно надо переопределять drawBackground.  :)


Название: Re: Пример делегата для закраски фона ячейки
Отправлено: stealth от Август 21, 2007, 18:25
Опять же need пример переопределения drawBackground :)


Название: Re: Пример делегата для закраски фона ячейки
Отправлено: EhTemka от Август 21, 2007, 20:48
Код:
void GuiDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
{
    if (index.column() != Gui::COLUMN_IMAGE) {         
        QStyleOptionViewItem opt(option);               
        opt.decorationSize = QSize(0, 0);         

        if (option.state & QStyle::State_Selected) {
            QColor colIndex = index.data(Qt::BackgroundColorRole).value<QColor>();
            //QBrush brush;
            QPalette palette;
            if ((colIndex.blue() + colIndex.red() + colIndex.green() + colIndex.alpha()) < 1020) {
                //brush.setColor(QColor(0,0,255,30));
                palette.setColor(QPalette::Normal, QPalette::Highlight, QColor(0,0,255,30));
            } else {
                //brush.setColor(QColor(0,0,255,255));
                palette.setColor(QPalette::Normal, QPalette::Highlight, QColor(0,0,255,255));
            }

            painter->fillRect(option.rect, colIndex);
            painter->fillRect(option.rect, palette.highlight()/*brush*/);
        }
        QItemDelegate::paint(painter, opt, index);
    } else {

        if (!index.data(Qt::DecorationRole).isNull()) {
            QImage pic = index.data(Qt::DecorationRole).value<QImage>();
            painter->drawImage(option.rect, pic, pic.rect());                     
        } else {           
            bool wait = mod_->getWait();
            if (!wait) {                       
                //if (!index.data(Qt::DisplayRole).isNull()) {
                    QModelIndex *ind = new QModelIndex(index);
                    mod_->setPic(ind);
                //}
            }             
        }       
    }

    QPen pen = painter->pen();
    QPen newPen(Qt::black);   
    newPen.setWidth(1);
    painter->setPen(newPen);     
    painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
    painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
    painter->setPen(pen);   
}

такой пойдет?


Название: Re: Пример делегата для закраски фона ячейки
Отправлено: stealth от Август 21, 2007, 22:20
Спасибо, подойдет конечно! :)