Qt当字符长度超过控件宽度时使用省略号

本文介绍了在Qt界面设计中,如何处理文字过长的情况。通过设置QLabel和QPushButton的样式及属性,实现了文字内容在控件宽度不足时自动添加省略号的功能,并提供了自定义的FixLabel和FixButton类,支持右、左、中三种省略方式。同时,当鼠标悬停时,可通过Tooltip查看完整文字。
摘要由CSDN通过智能技术生成

1、正常情况下,如果宽度足够:

    QLabel *textLabel = new QLabel(this);
    textLabel->setStyleSheet("background-color:red");
    textLabel->setAlignment(Qt::AlignCenter);
    textLabel->setFixedWidth(500);
    QString mStr = "hello world";
    textLabel->setText(mStr);

2、控件宽度不够(把宽度改为100),不处理:

如图,无法显示完全。

3、处理之后:

代码:

    QLabel *textLabel = new QLabel(this);
    textLabel->setStyleSheet("background-color:red");
    textLabel->setAlignment(Qt::AlignCenter);
    textLabel->setFixedWidth(100);
    QString mStr = "hello world";
    textLabel->setText(mStr);

    QFontMetrics  fontMetrics(textLabel->font());
    int fontSize = fontMetrics.width(mStr);
    if (fontSize > textLabel->width()) {
        textLabel->setText(fontMetrics.elidedText(mStr, Qt::ElideRight, textLabel->width()));
        textLabel->setToolTip(mStr);
    } else {
        textLabel->setText(mStr);
        textLabel->setToolTip("");
    }

当然,我们也可以改为省略左边的内容(Qt::ElideLeft):

又或是省略中间的内容(Qt::ElideMiddle):

文字过长自动省略号的Label:

.h:

#ifndef FIXLABEL_H
#define FIXLABEL_H
#include <QLabel>

//文本长自动省略并添加悬浮
class  FixLabel : public QLabel
{

    Q_OBJECT
public:
    explicit FixLabel(QWidget *parent = nullptr);
    explicit FixLabel(QString text , QWidget *parent = nullptr);
    ~FixLabel();
    void setText(const QString &text, bool saveTextFlag = true);
protected:
    void paintEvent(QPaintEvent *event);

private:
    QString mStr;
};


#endif // FIXLABEL_H

.cpp:

#include "fixlabel.h"
#include <QFontMetrics>
#include <QDebug>

FixLabel::FixLabel(QWidget *parent):
    QLabel(parent)
{

}

FixLabel::FixLabel(QString text , QWidget *parent):
    QLabel(parent)
{
    this->setText(text);
}

FixLabel::~FixLabel()
{

}

void FixLabel::paintEvent(QPaintEvent *event)
{
    QFontMetrics fontMetrics(this->font());
    int fontSize = fontMetrics.width(mStr);
    if (fontSize > this->width()) {
        this->setText(fontMetrics.elidedText(mStr, Qt::ElideRight, this->width()), false);
        this->setToolTip(mStr);
    } else {
        this->setText(mStr, false);
        this->setToolTip("");
    }
    QLabel::paintEvent(event);
}

void FixLabel::setText(const QString & text, bool saveTextFlag)
{
    if (saveTextFlag)
        mStr = text;
    QLabel::setText(text);
}

文字过长自动省略号的button:

#ifndef _FIXBUTTON_H_
#define _FIXBUTTON_H_
#include <QPushButton>


class  FixButton : public QPushButton
{
    Q_OBJECT
public:
    FixButton(QWidget *parent = nullptr);
    ~FixButton();
    void setText(const QString &text, bool saveTextFlag = true);
private:
    void paintEvent(QPaintEvent *event);

private:
    QString mStr;
};

#endif
#include "fixbutton.h"
#include <QFontMetrics>
#include <QDebug>

FixButton::FixButton(QWidget *parent):
    QPushButton(parent)
{

}

FixButton::~FixButton()
{

}

void FixButton::paintEvent(QPaintEvent *event)
{
    QFontMetrics fontMetrics(this->font());
    int fontSize = fontMetrics.width(mStr);
    int showTextSize = this->width() - this->contentsMargins().left() - this->contentsMargins().right();
    if (fontSize > showTextSize) {
        this->setText(fontMetrics.elidedText(mStr, Qt::ElideRight, showTextSize), false);
        this->setToolTip(mStr);
    } else {
        this->setText(mStr, false);
        this->setToolTip("");
    }
    QPushButton::paintEvent(event);
}

void FixButton::setText(const QString & text, bool saveTextFlag)
{
    if (saveTextFlag)
        mStr = text;
    QPushButton::setText(text);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值