[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