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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите по QItemDelegate  (Прочитано 9544 раз)
UVV
Гость
« : Август 29, 2007, 08:00 »

Использую QSqlRelationalTableModel и QTableView.
Нужно сделать делегата, который будет выделять все значения, кроме одного, в одном столбце красным цветом шрифта.
Записан
EhTemka
Гость
« Ответ #1 : Август 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);


...

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

« Последнее редактирование: Август 29, 2007, 10:49 от EhTemka » Записан
UVV
Гость
« Ответ #2 : Август 29, 2007, 11:38 »

Нет!
Попробую объяснить подробнее.
Есть столбец, скажем, под номером 5.
Поля в этом столбце могут иметь значения: "Норма", "Плохо", "Средне" и т.п.
Надо, что бы все, которые не "Норма" были красным цветом.
У меня как раз с этой проверкой и загвоздка.
Записан
denka
Гость
« Ответ #3 : Август 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);
}
Записан
UVV
Гость
« Ответ #4 : Август 30, 2007, 05:06 »

Спасибо, значение проверить получилось.
Но мне нужно не красный цвет фона, а красный цвет шрифта!
Записан
Lion
Гость
« Ответ #5 : Август 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);
}
Записан
UVV
Гость
« Ответ #6 : Август 30, 2007, 07:49 »

Для этого не надо переписывать делегат юзай Qt::ForegroundRole = Qt::red или
А пример можно?
Код:
...
      option.palette.setBrush(QPalette::Text,Qt::red);
...
В этой строке случайно нет ошибки?
Записан
EhTemka
Гость
« Ответ #7 : Август 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(...)

« Последнее редактирование: Август 30, 2007, 17:17 от EhTemka » Записан
Lion
Гость
« Ответ #8 : Август 30, 2007, 18:21 »

Для этого не надо переписывать делегат юзай Qt::ForegroundRole = Qt::red или
А пример можно?
Мониторь добавляемые индексы, например, через сигналы QAbstractItemModel rowsInserted  и columnsInserted и в случае необходимости устанавливай Qt::ForegroundRole = Qt::red
Записан
UVV
Гость
« Ответ #9 : Август 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(...)



Всем спасибо! Такой вариант мне подходит больше всего.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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