Russian Qt Forum

Qt => Model-View (MV) => Тема начата: UVV от Август 29, 2007, 08:00



Название: Подскажите по QItemDelegate
Отправлено: UVV от Август 29, 2007, 08:00
Использую QSqlRelationalTableModel и QTableView.
Нужно сделать делегата, который будет выделять все значения, кроме одного, в одном столбце красным цветом шрифта.


Название: Re: Подскажите по QItemDelegate
Отправлено: EhTemka от Август 29, 2007, 09:50
Код:
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
{
    if (option.state & QStyle::State_Selected) {
        if (index.column() != myColumn) {                       
            painter->fillRect(option.rect, QColor(0,0,255,255));               
        } else {                         
            painter->fillRect(option.rect, QColor(255,0,0,255));
        }
    }

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

...

QTableView *table = new QTableView();
table->setSelectionBehavior(QAbstractItemView::SelectRows);
QPalette palette;
palette.setColor(QPalette::Normal, QPalette::Highlight, QColor(0,0,0,0));
table->setPalette(palette);


...

Можно как-нибуть так...



Название: Re: Подскажите по QItemDelegate
Отправлено: UVV от Август 29, 2007, 11:38
Нет!
Попробую объяснить подробнее.
Есть столбец, скажем, под номером 5.
Поля в этом столбце могут иметь значения: "Норма", "Плохо", "Средне" и т.п.
Надо, что бы все, которые не "Норма" были красным цветом.
У меня как раз с этой проверкой и загвоздка.


Название: Re: Подскажите по QItemDelegate
Отправлено: denka от Август 29, 2007, 11:54
А что тебе мешает получить это значение и проверить его в paint ? То есть если брать код который выше, то это будет что то такое:
Код:
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
{
    if (index.column() == myColumn && index.data( Qt::DisplayRole ).toString() != tr("Норма") ) {                       
            painter->fillRect(option.rect, QColor(255,0,0,255));
    }
    QItemDelegate::paint(painter, option, index);
}


Название: Re: Подскажите по QItemDelegate
Отправлено: UVV от Август 30, 2007, 05:06
Спасибо, значение проверить получилось.
Но мне нужно не красный цвет фона, а красный цвет шрифта!


Название: Re: Подскажите по QItemDelegate
Отправлено: Lion от Август 30, 2007, 06:54
Спасибо, значение проверить получилось.
Но мне нужно не красный цвет фона, а красный цвет шрифта!
Для этого не надо переписывать делегат юзай Qt::ForegroundRole = Qt::red или
Код:
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
{
    if (index.column() == myColumn && index.data( Qt::DisplayRole ).toString() != tr("Норма") ) {                       
      option.palette.setBrush(QPalette::Text,Qt::red);
    }
    QItemDelegate::paint(painter, option, index);
}


Название: Re: Подскажите по QItemDelegate
Отправлено: UVV от Август 30, 2007, 07:49
Для этого не надо переписывать делегат юзай Qt::ForegroundRole = Qt::red или
А пример можно?
Код:
...
      option.palette.setBrush(QPalette::Text,Qt::red);
...
В этой строке случайно нет ошибки?


Название: Re: Подскажите по QItemDelegate
Отправлено: EhTemka от Август 30, 2007, 17:09
 Да, вроде есть. const QStyleOptionViewItem &option передается в паинт как константа, и в setBrush еще надо ColorGroup передовать

Попробуй так
Код:
if (index.column() == myColumn && index.data( Qt::DisplayRole ).toString() != tr("Норма") ) { 
      QStyleOptionViewItem myOption =  option;                     
      myOption .palette.setBrush(QPalette::Normal, QPalette::Text,Qt::red);
      QItemDelegate::paint(painter, myOption , index);
} else {
      QItemDelegate::paint(painter, option, index);
}

либо можно в painter установить кисть painter->setBrush(...)



Название: Re: Подскажите по QItemDelegate
Отправлено: Lion от Август 30, 2007, 18:21
Для этого не надо переписывать делегат юзай Qt::ForegroundRole = Qt::red или
А пример можно?
Мониторь добавляемые индексы, например, через сигналы QAbstractItemModel rowsInserted  и columnsInserted и в случае необходимости устанавливай Qt::ForegroundRole = Qt::red


Название: Re: Подскажите по QItemDelegate
Отправлено: UVV от Август 31, 2007, 05:19
Да, вроде есть. const QStyleOptionViewItem &option передается в паинт как константа, и в setBrush еще надо ColorGroup передовать

Попробуй так
Код:
if (index.column() == myColumn && index.data( Qt::DisplayRole ).toString() != tr("Норма") ) { 
      QStyleOptionViewItem myOption =  option;                     
      myOption .palette.setBrush(QPalette::Normal, QPalette::Text,Qt::red);
      QItemDelegate::paint(painter, myOption , index);
} else {
      QItemDelegate::paint(painter, option, index);
}

либо можно в painter установить кисть painter->setBrush(...)



Всем спасибо! Такой вариант мне подходит больше всего.