[Interest] Item / Views: QLabel delegate

Tony Rietwyk tony at rightsoft.com.au
Sat Dec 2 07:39:47 CET 2023


Hi Laslo,

In my delegate, I use a QTextDocument instead and I also override sizeHint:

void MessagesDelegate::paint(
	QPainter *painter,
	const QStyleOptionViewItem &option,
	const QModelIndex &index) const
{
  QStyleOptionViewItem optionV4 = option;
  initStyleOption(&optionV4, index);
  QStyle *style = optionV4.widget ? optionV4.widget->style() : QApplication::style();
  QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4);
  // Draw the item without any text:
  style->drawPrimitive(QStyle::PE_PanelItemViewItem, &optionV4, painter, optionV4.widget);
  _doc.setTextWidth(-1);
  _doc.setHtml("This is a test message");
  QAbstractTextDocumentLayout::PaintContext ctx;
  ctx.palette = optionV4.palette;
  // TODO:  Change ctx.palette according to cell being disabled and/or selected.
  painter->save();
  painter->translate(textRect.topLeft());
  painter->setClipRect(textRect.translated(-textRect.topLeft()));
  doc.documentLayout()->draw(painter, ctx);
  painter->restore();
}


QSize MessagesDelegate::sizeHint(
	const QStyleOptionViewItem& option,
	const QModelIndex& index) const
{
  _doc.setTextWidth(-1);
  _doc.setHtml("This is a test message");
  return QSize(_doc.idealWidth(), _doc.size().height());
}

Sorry I can't release the full code as it does lots of other things like 
icon decoration role, clicking on links in the HTML, etc.

Hope that helps,

Tony


On 2/12/2023 12:06 am, Laszlo Papp wrote:
> Hi everyone,
>
> I am not able to render a custom widget, like a QLabel in a QTreeView 
> cell with a custom delegate. The delegate code is this:
>
> *Header*
> #ifndef MESSAGESDELEGATE_H
> #define MESSAGESDELEGATE_H
>
> #include <QLabel>
> #include <QStyledItemDelegate>
>
> class MessagesDelegate : public QStyledItemDelegate
> {
>  Q_OBJECT
>
> public:
>  explicit MessagesDelegate(QObject* parent = nullptr);
>
>  void paint(QPainter *painter, const QStyleOptionViewItem &option, 
> const QModelIndex &index) const override;
>
> private:
>  mutable QLabel _label;
> };
>
> #endif
>
> *Source*
> #include "MessagesDelegate.h"
>
> #include <QLabel>
>
> MessagesDelegate::MessagesDelegate(QObject* parent)
>  : QStyledItemDelegate(parent)
> {
> }
>
> void MessagesDelegate::paint(QPainter* painter,
>                const QStyleOptionViewItem& option,
>                const QModelIndex& index) const
> {
>  _label.setText("This is a test message");
>  _label.render(painter);
> }
>
> and then:
>
> _messageDelegate = new MessagesDelegate(this);
> _messageTreeView->setItemDelegateForColumn(MessageColumn, 
> _messageDelegate);
>
> But I am seeing my QTreeView cell empty instead of seeing the above 
> "This a test message" in there. Do you know what I may be doing wrong?
>
> I took this idea from here:
> https://groups.google.com/g/python_inside_maya/c/FXB_V0llUpY/m/mpJOQkyJCgAJ
>
> Thank you in advance.
>
> Kind regards,
> László
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20231202/ff5434eb/attachment.htm>


More information about the Interest mailing list