QLabel内容过多强行挤压布局

当把QLabel放到布局管理器时很容易出现下面的问题
内容过多显示
即使设置hboxlayout的子元素比例也无效,解决这个问题的办法很简单,设置QLabel的sizePolicy水平策略为Ignore就行了,这时候计算QLabel宽度的时候会忽略QLabel的sizeHint(),强制按hboxlayout比例显示
reset


如果想过多内容显示省略号

自定义QLabel绘制,使用fontMetrics().elidedText

//CustomLabel.h
#pragma once

#include <qlabel.h>

class CustomLabel : public QLabel {
public:
    using QLabel::QLabel;

protected:
    void paintEvent(QPaintEvent*) override;
};

//CustomLabel.cpp
#include "CustomLabel.h"

#include <qpainter.h>
#include <qfontmetrics.h>

void CustomLabel::paintEvent(QPaintEvent *) {
    QPainter painter(this);

    QString str = text();
    int w = width();

    str = fontMetrics().elidedText(str, Qt::ElideRight, w);
    painter.drawText(rect(), Qt::AlignLeft | Qt::AlignVCenter, str);
}
如果想换行

方法1:不使用自定义QLabel,直接调用setWordWrap

ui.label->setWordWrap(true);

方法2:有时候boss要你在QLabel上整点花样,必须自定义QLabel自己绘制内容,wordwrap会失效。追踪QLabel源代码,看setWordWrap实现:

void QLabel::setWordWrap(bool on)
{
    Q_D(QLabel);
    if (on)
        d->align |= Qt::TextWordWrap;
    else
        d->align &= ~Qt::TextWordWrap;

    d->updateLabel();
}

这里align加了个Qt::TextWordWrap属性,看看paintEvent里面align怎么用的

void QLabel::paintEvent(QPaintEvent *)
{
	...
	if (d->isTextLabel) {
		...
		int flags = align | (d->textDirection() == Qt::LeftToRight ? Qt::TextForceLeftToRight
                                                                       : Qt::TextForceRightToLeft);
        if (d->hasShortcut) {
            flags |= Qt::TextShowMnemonic;
            if (!style->styleHint(QStyle::SH_UnderlineShortcut, &opt, this))
                flags |= Qt::TextHideMnemonic;
        }
        style->drawItemText(&painter, lr.toRect(), flags, opt.palette, isEnabled(), d->text, foregroundRole());
	}
}

这里给align加了其他可能的奇怪属性给了flags,最后使用QStyle的drawItemText绘制。看到这里就很明白了,明明是个alignment却可以叠加TextFlag相关属性,那么自己绘制自动换行就很简单了

painter.drawText(rect(), Qt::AlignLeft | Qt::AlignVCenter | Qt::TextWordWrap, str);

wordwrap

html内容加省略

待研究。。

html内容自动换行

html内容QLabel会自动换行,关于QLabel能支持的html标签及属性,看文档Supported HTML Subset

QPainter怎么绘制html

自定义的QLabel想要绘制html,需要借助QTextDocument类

QString str = text();
int w = width();
    
QTextDocument td;
td.setHtml(str);
td.setUndoRedoEnabled(false);
td.setTextWidth(w);
td.setUseDesignMetrics(true);
td.setDefaultTextOption(QTextOption(Qt::AlignHCenter));
td.drawContents(&painter, rect());
发布了12 篇原创文章 · 获赞 3 · 访问量 3921
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览