美文网首页
QTreeWidget 文字自动调整行高

QTreeWidget 文字自动调整行高

作者: 雯饰太一 | 来源:发表于2023-05-28 09:08 被阅读0次

一行代码可以搞定:

int labelHeight = (label->fontMetrics().width(str) / 
    ui.treeWidget->columnWidth(1)) == 0 
    ? label->fontMetrics().height() 
    : (label->fontMetrics().width(str) / ui.treeWidget->columnWidth(1) + 1) *   //行数 = 显示总长 / 控件列宽
    (label->fontMetrics().height() + label->fontMetrics().lineSpacing());       //每行的高度 = 行高 + 行距

其中label是承载字符串的label,ui.treeWidget是树形空间,上述代码希望在数据很长的时候能够达到一个换行的效果。

其他方法-代理

要实现 QTreeWidget 内的文字自动换行和自动调整行高,可设置适当的委托(Delegate)来处理。以下是一个示例代码,演示了如何实现文字自动换行和自动调整行高的 QTreeWidget

#include <QApplication>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QStyledItemDelegate>
#include <QPainter>

class TreeWidgetItemDelegate : public QStyledItemDelegate
{
public:
    explicit TreeWidgetItemDelegate(QObject* parent = nullptr) : QStyledItemDelegate(parent) {}

    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
    {
        QStyleOptionViewItem opt = option;
        initStyleOption(&opt, index);

        QStyledItemDelegate::paint(painter, opt, index);

        painter->save();

        if (index.column() == 0)
        {
            QRect rect = opt.rect.adjusted(2, 2, -2, -2);
            painter->drawText(rect, Qt::TextWordWrap, opt.text);
        }

        painter->restore();
    }

    QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override
    {
        QSize size = QStyledItemDelegate::sizeHint(option, index);

        if (index.column() == 0)
        {
            QString text = index.data().toString();
            QFontMetrics fontMetrics(option.font);
            QRect rect = fontMetrics.boundingRect(option.rect, Qt::TextWordWrap, text);
            size.setHeight(rect.height());
        }

        return size;
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTreeWidget treeWidget;
    treeWidget.setHeaderLabels({"Items"});
    treeWidget.setIndentation(20);

    TreeWidgetItemDelegate* delegate = new TreeWidgetItemDelegate(&treeWidget);
    treeWidget.setItemDelegate(delegate);

    QTreeWidgetItem* item1 = new QTreeWidgetItem(&treeWidget, {"Long Text Example 1"});
    QTreeWidgetItem* item2 = new QTreeWidgetItem(&treeWidget, {"Long Text Example 2"});

    treeWidget.show();

    return app.exec();
}

在上述代码中,我们定义了一个 TreeWidgetItemDelegate 类作为委托,继承自 QStyledItemDelegate。在 paint 函数中,我们使用 drawText 方法绘制文字,并设置了 Qt::TextWordWrap 标志以实现自动换行。在 sizeHint 函数中,我们根据文字内容和字体计算了适当的行高。

通过设置委托对象为 QTreeWidget 的委托,你可以实现 QTreeWidget 内的文字自动换行和自动调整行高。当文字内容过长时,文字会自动换行并调整行高以适应内容。

请注意,在此示例中,我们只针对第一列的文字进行了自动换行和自动调整行高的处理。如果你希望其他列的文字也能自动换行和调整行高,可以相应地修改委托的 paintsizeHint 函数来处理多列内容。

在委托类的 sizeHint 函数中,我们通过使用 QFontMetrics 类的 boundingRect 函数来计算换行后文本的高度。

具体来说,在 sizeHint 函数中,我们获取了要绘制的文本内容(通过 index.data().toString())和委托使用的字体(通过 option.font)。然后,我们使用 QFontMetricsboundingRect 函数来获取以指定字体绘制文本时的边界矩形。

boundingRect 函数接受多个参数,其中包括了用于绘制文本的矩形边界、绘制文本时使用的文本格式(例如 Qt::TextWordWrap),以及要绘制的文本内容。通过调用 boundingRect 函数,我们可以获得文本在给定矩形边界内绘制时的大小,包括了换行后的高度。

因此,通过 QFontMetrics 类的 boundingRect 函数,我们能够计算出文字在换行后的高度,以便在 sizeHint 函数中返回正确的行高。这样,QTreeWidget 中的每一行都可以根据文字内容自动调整行高,确保文字能够完整显示。

若是有益,望君不吝点赞~

相关文章

网友评论

      本文标题:QTreeWidget 文字自动调整行高

      本文链接:https://www.haomeiwen.com/subject/hkyzsdtx.html