Ich denke, Sie können setItemDelegate Methode der Treeview verwenden, um benutzerdefinierte Maler für Ihre Treeview-Elemente einzurichten. In der paint-Methode des Delegate können Sie QTextDocument verwenden, um den Text des Elements als HTML zu laden und zu rendern. Bitte überprüfen Sie, ob ein Beispiel unten für Sie arbeiten würde:
treeview Initialisierung:
...
// create simple model for a tree view
QStandardItemModel *model = new QStandardItemModel();
QModelIndex parentItem;
for (int i = 0; i < 4; ++i)
{
parentItem = model->index(0, 0, parentItem);
model->insertRows(0, 1, parentItem);
model->insertColumns(0, 1, parentItem);
QModelIndex index = model->index(0, 0, parentItem);
model->setData(index, "<span>blah-blah <b>some text</b> other blah</span>");
}
// create custom delegate
HTMLDelegate* delegate = new HTMLDelegate();
// set model and delegate to the treeview object
ui->treeView->setModel(model);
ui->treeView->setItemDelegate(delegate);
...
individuelle Delegat Implementierung
class HTMLDelegate : public QStyledItemDelegate
{
protected:
void paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
QSize sizeHint (const QStyleOptionViewItem & option, const QModelIndex & index) const;
};
void HTMLDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
QStyleOptionViewItemV4 options = option;
initStyleOption(&options, index);
painter->save();
QTextDocument doc;
doc.setHtml(options.text);
options.text = "";
options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter);
painter->translate(options.rect.left(), options.rect.top());
QRect clip(0, 0, options.rect.width(), options.rect.height());
doc.drawContents(painter, clip);
painter->restore();
}
QSize HTMLDelegate::sizeHint (const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QStyleOptionViewItemV4 options = option;
initStyleOption(&options, index);
QTextDocument doc;
doc.setHtml(options.text);
doc.setTextWidth(options.rect.width());
return QSize(doc.idealWidth(), doc.size().height());
}
hoffe, das hilft, sieht
UPDATE0: Änderungen HTMLDelegate, um Symbole sichtbar zu machen und verschiedene Stiftfarben für ausgewählte Objekte
void HTMLDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
QStyleOptionViewItemV4 options = option;
initStyleOption(&options, index);
painter->save();
QTextDocument doc;
doc.setHtml(options.text);
options.text = "";
options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter);
// shift text right to make icon visible
QSize iconSize = options.icon.actualSize(options.rect.size());
painter->translate(options.rect.left()+iconSize.width(), options.rect.top());
QRect clip(0, 0, options.rect.width()+iconSize.width(), options.rect.height());
//doc.drawContents(painter, clip);
painter->setClipRect(clip);
QAbstractTextDocumentLayout::PaintContext ctx;
// set text color to red for selected item
if (option.state & QStyle::State_Selected)
ctx.palette.setColor(QPalette::Text, QColor("red"));
ctx.clip = clip;
doc.documentLayout()->draw(painter, ctx);
painter->restore();
}
Beachten Sie, dass der Abschnitt ctx.palette.setcolor eine zusätzliche verschachtelte benötigt, wenn das Konto für OptionV4.state inaktiv ist.Andernfalls wird der Text fast unlesbar, wenn Sie in ein anderes Fenster wechseln. Funktioniert ansonsten super. Danke – mmccoo
Text Farbhinweis: Verwenden Sie 'else ctx.palette.setColor (QPalette :: Text, optionV4.palette.color (QPalette :: Aktiv, QPalette :: Text));' um sicherzustellen, dass Textfarbe richtig eingestellt ist. Wird benötigt, wenn nicht standardmäßige Textfarben über Stylesheet verwendet werden. –
QTextDocument Setup: Wenn Sie 'doc.setDocumentMargin (0); doc.setDefaultFont (optionV4.font); '(fügen Sie beides in paint & sizeHint hinzu), dann sind die Schriftarten korrekt, wenn Sie sie über Stylesheet ändern. Auch der Aufruf 'doc.setTextWidth' in der sizeHint-Routine scheint nichts zu tun. Wenn Sie es sowohl in die 'sizeHint'- als auch die' paint'-Methode schreiben, können Sie Wörter verschwinden lassen, anstatt abgeschnitten zu werden, wenn die Spalte des Artikels schrumpft. –