Tôi đoán bạn có thể sử dụng phương thức setItemDelegate của treeview để thiết lập họa sĩ tùy chỉnh cho các mục treeview của bạn. Trong phương thức vẽ của đại biểu, bạn có thể sử dụng QTextDocument để tải văn bản của mục dưới dạng html và hiển thị nó. Hãy kiểm tra xem một ví dụ dưới đây sẽ làm việc cho bạn:
treeview khởi:
...
// 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);
...
thực hiện tùy chỉnh đại biểu
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());
}
hy vọng điều này giúp, coi
update0: thay đổi HTMLĐăng ký để hiển thị các biểu tượng và màu bút khác nhau cho các mục được chọn
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();
}
lưu ý rằng phần ctx.palette.setcolor cần thêm lồng nhau nếu tài khoản cho tùy chọnV4.state không hoạt động.Nếu không, khi bạn di chuyển đến một cửa sổ khác, văn bản trở nên gần như không đọc được. Hoạt động tuyệt vời nếu không. Cảm ơn – mmccoo
Lưu ý màu văn bản: Sử dụng 'else ctx.palette.setColor (QPalette :: Văn bản, tùy chọnV4.palette.color (QPalette :: Hoạt động, QPalette :: Văn bản));' để đảm bảo màu văn bản được đặt chính xác. Cần thiết khi sử dụng màu văn bản không mặc định thông qua biểu định kiểu. –
Thiết lập QTextDocument: Nếu bạn thêm 'doc.setDocumentMargin (0); doc.setDefaultFont (optionV4.font); '(thêm nó vào cả paint & sizeHint) thì các phông chữ sẽ đúng khi bạn thay đổi chúng thông qua stylesheet. Ngoài ra, các cuộc gọi 'doc.setTextWidth' trong thói quen sizeHint dường như không làm gì cả. Nếu bạn đặt nó trong cả hai phương thức 'sizeHint' và' paint' thì bạn có thể có các từ biến mất thay vì bị cắt bỏ khi cột của mục co lại. –