Qt自定义控件:字体大小随着控件大小自适应变化

重写QWidget的paintEvent函数,自定义类如下:
#define MIN_FONT_SIZE 1
#define MAX_FONT_SIZE 1000

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr);
    void setText(const QString &str);

protected:
    void paintEvent(QPaintEvent *event);
    QString string;
};

实现部分:

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{

}

void MyWidget::setText(const QString &str)
{
    if(string != str)
    {
        string = str;
        update();
    }
}

void MyWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    if(string.isEmpty())
        return;

    QRectF rectangle(0, 0, this->width(), this->height());
    QRectF boundingRect;
    QTextOption o;
    o.setWrapMode(QTextOption::WrapAnywhere);
    o.setAlignment(Qt::AlignVCenter);

    QPainter painter(this);
    QFont font = painter.font();
    font.setFamily("楷体"); //字体
    for(int i = MIN_FONT_SIZE; i < MAX_FONT_SIZE; i++)
    {
        font.setPixelSize(i);
        painter.setFont(font);
        boundingRect = painter.boundingRect(rectangle, string, o);
        if(!rectangle.contains(boundingRect))
        {
            font.setPixelSize((i - 1) == 0 ? MIN_FONT_SIZE : (i - 1));
            painter.setFont(font);
            break;
        }
    }

    painter.drawText(rectangle, string, o);


//    QPen pen = painter.pen();
//    pen.setStyle(Qt::DotLine);
//    pen.setColor(Qt::red);
//    painter.setPen(pen);
//    painter.drawRect(boundingRect.adjusted(0, 0, -pen.width(), -pen.width()));

//    pen.setStyle(Qt::DashLine);
//    pen.setColor(Qt::blue);
//    painter.setPen(pen);
//    painter.drawRect(rectangle.adjusted(0, 0, -pen.width(), -pen.width()));
}

可能效率不太高,基本能用,效果如下:

 

Demo链接。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值