QLabel标签一个非常基础且常用的控件,用于在用户界面上显示文本或图片,一般不接受用户输入。

1. 效果演示

演示标签的字体设置、文本换行、加载静态和动态图片

qlabel

2. 属性和方法

QLabel有很多属性,完整的可查看帮助文档,这里列出常用的属性和方法。

2.1 文本

可以获取和设置按钮上显示的文本

QString text() const;
void setText(const QString &text);

2.2 对齐方式

用于设置标签中的内容在水平和垂直两个方向上的对齐方式,比如左对齐、右对齐、上对齐、下对齐、水平居中、垂直居中等。

// 获取和设置文本的对齐方式
Qt::Alignment alignment() const;
void setAlignment(Qt::Alignment);

其中,Qt::Alignment是一个枚举,常用取值如下:

枚举 含义
Qt::AlignLeft 0x0001 水平方向-左对齐
Qt::AlignRight 0x0002 水平方向-右对齐
Qt::AlignHCenter 0x0004 水平方向-居中对齐
Qt::AlignTop 0x0020 垂直方向-上对齐
Qt::AlignBottom 0x0040 垂直方向-下对齐
Qt::AlignVCenter 0x0080 垂直方向-居中对齐
Qt::AlignCenter(AlignVCenter | AlignHCenter) 0x0084 垂直方向和水平方向-居中对齐

上面的每一个宏,都代表16进制中的一位,可以进行或(|)操作,来同时设置多个对齐方式。
该属性,既可以在Qt设计师右侧的属性窗口中修改,也可以在代码中动态地获取和修改

2.3 自动换行

标签的自动换行策略,就是让文本在到达标签右边界时自动换行显示,而不是一直横向延伸(被截断或超出)。

// 获取和设置文本是否允许换行
// 换行时:在 word-breaks处,不会将一个完整的单词显示在两行
bool wordWrap() const; // 判断是否允许换行
void setWordWrap(bool on); // 设置是否允许换行 

2.4 图像

可以将一个QPixmap对象设置到标签上,让标签从显示文字变为显示图片

// 获取和设置显示的图像
const QPixmap *pixmap() const;
void setPixmap(const QPixmap &pixmap);

3. 从零实现

从零写代码实现整体效果,以演示标签的属性以及信号槽的用法

3.1 布局

在UI设计师界面,拖拽对应的控件,修改显示的文字、控件的名称,然后完成布局

  • 合理地使用了水平、垂直、栅格布局
  • 合理地使用弹簧
  • 合理地调整Layout的各种参数,来设置外边距、内边距
  • 合理地调整字体大小
  • 在设计阶段,设置标签的背景色

即可完成以下效果,多操作自然就熟练了(完成后的代码,会一并共享给大家的~)
qt-base

3.2 添加资源文件

把用到的静态和动态图片,作为资源文件添加到项目中,如下:
qt-base

3.3 代码实现

3.3.1 字体设置

首先,在mywidget.h中,声明相应的槽函数,如下:

#include <QButtonGroup>
#include <QTimer>

class MyWidget : public QWidget {

private slots:
    // 字体设置
    void onBtnGroupAlignmentClicked(int id);
    void onChkFontClicked(bool checked);

    void onTimeout();

private:
    QButtonGroup* btnGroupAlignment;
    QTimer* timer;
};

然后,在mywidget.cpp的构造中,关联槽函数,如下:

MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
    ui->setupUi(this);

    this->setWindowTitle("明王讲QT | 第二章 常用控件 | 2.3 标签QLabel");

    // 1. 对齐和字体设置
    // 对齐
    ui->lblFont->setText("2024-12-12 12:10:00");

    btnGroupAlignment = new QButtonGroup(this);
    btnGroupAlignment->addButton(ui->radioAlignLeft, 0);
    btnGroupAlignment->addButton(ui->radioAlignCenter, 1);
    btnGroupAlignment->addButton(ui->radioAlignRight, 2);

    connect(btnGroupAlignment, &QButtonGroup::idClicked, this, &MyWidget::onBtnGroupAlignmentClicked);
    ui->radioAlignCenter->click();

    // 字体
    connect(ui->chkBold, &QCheckBox::clicked, this, &MyWidget::onChkFontClicked);
    connect(ui->chkItalic, &QCheckBox::clicked, this, &MyWidget::onChkFontClicked);
    connect(ui->chkUnderline, &QCheckBox::clicked, this, &MyWidget::onChkFontClicked);

    // 定时器
    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &MyWidget::onTimeout);
    timer->start(500);
}

最后,实现这两个槽函数,如下:

#include <QDateTime>

void MyWidget::onBtnGroupAlignmentClicked(int id) {
    if ( id == 0 ) {
        ui->lblFont->setAlignment(Qt::AlignLeft);
    } else if ( id == 1 ) {
        ui->lblFont->setAlignment(Qt::AlignCenter);
    } else if ( id == 2 ) {
        ui->lblFont->setAlignment(Qt::AlignRight);
    }
}

void MyWidget::onChkFontClicked(bool checked) {
    QFont font = ui->lblFont->font();

    font.setBold(ui->chkBold->isChecked());
    font.setItalic(ui->chkItalic->isChecked());
    font.setUnderline(ui->chkUnderline->isChecked());

    ui->lblFont->setFont(font);
}

void MyWidget::onTimeout() {
    // 获取当前系统时间
    QDateTime currentTime = QDateTime::currentDateTime();

    // 将当前时间转换为字符串格式
    QString timeString = currentTime.toString("yyyy-MM-dd hh:mm:ss");

    // 显示
    ui->lblFont->setText(timeString);
}

3.3.2 文本换行

首先,在mywidget.h中,声明相应的槽函数,如下:

class MyWidget : public QWidget {

private slots:
    // 文本换行
    void on_btnDisableWrap_clicked();
    void on_btnEnableWrap_clicked();
}

然后,在mywidget.cpp的构造中,为标签设置文本,如下:

MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {

    // 2. 文本换行
    ui->lblWordWrap->setWordWrap(true);
    ui->lblWordWrap->setText(
        "Qt is a powerful and versatile cross-platform application and UI framework that enables developers to create sophisticated and responsive graphical "
        "user interfaces (GUIs) for desktop, mobile, and embedded systems.");
}

最后,实现这两个槽函数,如下:

void MyWidget::on_btnDisableWrap_clicked() {
    ui->lblWordWrap->setWordWrap(false);
}

void MyWidget::on_btnEnableWrap_clicked() {
    ui->lblWordWrap->setWordWrap(true);
}

3.3.3 加载静态图片

mywidget.cpp的构造中,加载静态图片,如下:

MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {

    // 3. 静态图片
    ui->lblPic1->setScaledContents(true);
    ui->lblPic2->setScaledContents(true);
    ui->lblPic3->setScaledContents(true);
    ui->lblPic4->setScaledContents(true);

    QPixmap px1, px2, px3, px4;
    px1.load(":/res/apple.png");
    px2.load(":/res/orange.png");
    px3.load(":/res/watermelon.png");
    px4.load(":/res/strawberry.png");

    ui->lblPic1->setPixmap(px1);
    ui->lblPic2->setPixmap(px2);
    ui->lblPic3->setPixmap(px3);
    ui->lblPic4->setPixmap(px4);
}

3.3.4 加载Gif动画

动态图片下载网站:https://vsgif.com/

mywidget.cpp的构造中,加载动态图片,如下:

#include <QMovie>

MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
    
    // 4. 动态图片
    ui->lblGif1->setScaledContents(true);
    ui->lblGif2->setScaledContents(true);
    ui->lblGif3->setScaledContents(true);
    ui->lblGif4->setScaledContents(true);

    QMovie* movie = new QMovie(":/res/gif1.gif");
    ui->lblGif1->setMovie(movie);
    movie->start();

    QMovie* movie2 = new QMovie(":/res/gif2.gif");
    ui->lblGif2->setMovie(movie2);
    movie2->start();

    QMovie* movie3 = new QMovie(":/res/gif3.gif");
    ui->lblGif3->setMovie(movie3);
    movie3->start();

    QMovie* movie4 = new QMovie(":/res/gif4.gif");
    ui->lblGif4->setMovie(movie4);
    movie4->start();
}

4. 点赞、获取源码

看到这里的小伙伴,去B站给明王一个【免费的点赞】吧,你的支持,是我持续更新优质内容的动力,感谢~

源码下载地址
链接: https://pan.baidu.com/s/1K5LvII_tVeDSkPzuqDMpIA
提取码: ming