void BudgetEntityDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() != 0 || !index.data().canConvert<BudgetEntity>()) { QStyledItemDelegate::paint(painter, option, index); return; } BudgetEntity entity = qvariant_cast<BudgetEntity>(index.data()); painter->save(); painter->setRenderHint(QPainter::Antialiasing); QLocale locale; QStyleOptionViewItemV4 opt = option; QStyledItemDelegate::initStyleOption(&opt, index); QRect rect = opt.rect; opt.text = ""; QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; if (opt.state & QStyle::State_Selected) { painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); } else { painter->setPen(opt.palette.color(cg, QPalette::Text)); } if (dateWidth <= 0) { QDate _date = QDate(9999, 12, 29); //*((int*)(&dateWidth)) = painter->fontMetrics().width(_date.toString(locale.dateFormat(QLocale::ShortFormat))) + 10; dateWidth = painter->fontMetrics().width(_date.toString(locale.dateFormat(QLocale::ShortFormat))) + 10;; } QString amount = locale.toCurrencyString(entity.amount(), locale.currencySymbol(QLocale::CurrencySymbol)); int amountWidth = painter->fontMetrics().width(amount); QRect adj = rect.adjusted(3, rect.height()/3, -3, rect.height()/3); painter->drawText(adj.adjusted(0, 0, -amountWidth, 0), Qt::TextSingleLine, entity.date().toString(locale.dateFormat(QLocale::ShortFormat))); painter->drawText(adj.adjusted(adj.left() + dateWidth, 0, -amountWidth, 0), Qt::TextWordWrap, entity.description()); painter->drawText(adj.adjusted(adj.left() + dateWidth + amountWidth, 0, 0, 0), Qt::AlignRight | Qt::TextSingleLine, amount); painter->restore(); }