Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: UVV от Сентябрь 03, 2009, 17:35



Название: Двухцветная ячейка в QTableView
Отправлено: 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.
Есть ли более правильные способы для реализации того, что мне надо?


Название: Re: Двухцветная ячейка в QTableView
Отправлено: Rcus от Сентябрь 03, 2009, 18:08
так чтобы ровно между символами? Ну разве что если шритф моноширинный (а может отключение хинтинга поможет). Иначе ширина частей строки не равна суммарной ширине. И еще стиль может рисовать текст с отступом от края ячейки даже при включенном выравнивании влево.


Название: Re: Двухцветная ячейка в QTableView
Отправлено: UVV от Сентябрь 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 закрашиваются те же пол-символа.