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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Двухцветная ячейка в QTableView  (Прочитано 3253 раз)
UVV
Гость
« : Сентябрь 03, 2009, 17:35 »

Привет.
Кто-нибудь реализовывал такое?
У меня сейчас есть делегат со следующим методом paint():
Код
C++ (Qt)
void BitViewDelegate::paint(QPainter *painter,
                           const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
{
   QString text = index.model()->data(index, Qt::DisplayRole).toString();
   QString l = text.left(5);
   QRect myRect = option.rect;
   myRect.setX(option.rect.x() + option.fontMetrics.width(l));
   myRect.setWidth(option.rect.width() - option.fontMetrics.width(l));
   painter->fillRect(myRect, Qt::green);
   QItemDelegate::paint(painter, option, index);
}
 

Я хочу, чтобы граница цветов была точно между символами. Проблема в том, что закрашивается половина символа, предшествующего строке l.
Есть ли более правильные способы для реализации того, что мне надо?
Записан
Rcus
Гость
« Ответ #1 : Сентябрь 03, 2009, 18:08 »

так чтобы ровно между символами? Ну разве что если шритф моноширинный (а может отключение хинтинга поможет). Иначе ширина частей строки не равна суммарной ширине. И еще стиль может рисовать текст с отступом от края ячейки даже при включенном выравнивании влево.
Записан
UVV
Гость
« Ответ #2 : Сентябрь 03, 2009, 18:30 »

так чтобы ровно между символами? Ну разве что если шритф моноширинный (а может отключение хинтинга поможет). Иначе ширина частей строки не равна суммарной ширине. И еще стиль может рисовать текст с отступом от края ячейки даже при включенном выравнивании влево.

Заглянув в исходники QStyledItemDelegate, я попробовал вот так:
Код
C++ (Qt)
...
   QStyleOptionViewItemV4 opt = option;
   initStyleOption(&opt, index);
   myRect.setX(opt.rect.x() + opt.fontMetrics.width(l));
   myRect.setWidth(opt.rect.width() - opt.fontMetrics.width(l));
   painter->fillRect(myRect, Qt::green);
 
   const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *> (&option);
   const QWidget *widget = v3->widget;
   QStyle *style = widget ? widget->style() : QApplication::style();
   style->drawItemText(painter,
                       opt.rect,
                       Qt::AlignLeft | Qt::AlignVCenter,
                       palette,
                       true,
                       text);
...
 

Но как я понял, оно будет зависеть от текущего стиля и не на всех системах будет вести себя одинаково Грустный
У меня на Linux отображается так, как надо, а на Windows закрашиваются те же пол-символа.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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