开篇介绍:
hello 大家,本篇博客我们来学习QLabel常见属性。
在 Qt 界面开发中,有一个控件我们几乎每天都会用到,它没有复杂的交互逻辑,却承担着界面中 80% 以上的 "纯展示" 工作 ------ 它就是 QLabel(标签控件)。QLabel 就像界面中的 "画布" 和 "告示牌",可以用来显示静态文本、动态提示、图片、图标,甚至可以通过简单的配置实现超链接跳转、伙伴控件联动等轻量交互。
很多新手刚接触 QLabel 时,只会简单地用 setText() 显示一行文字,却不知道它还有很多强大的属性可以让展示效果更丰富、更美观、更易用 ------ 比如用富文本给文字加颜色加粗、用图片填充整个控件、让长文本自动换行、点击标签就能聚焦输入框,等等。别担心!这篇文章我会结合 QLabel 的所有核心属性(text、textFormat、pixmap、scaledContents、alignment、wordWrap、indent、margin、openExternalLinks、buddy)进行解析
话不多说,我们正式开始!
第一章 先搞懂基础:QLabel 的定位与继承关系
在讲具体属性之前,我们必须先搞懂 QLabel 的 "身份"------ 也就是它在 Qt 控件体系中的定位和继承关系,这能帮我们理解为什么它能使用那么多属性,还能快速复用之前学过的 QWidget 的知识。
1.1 QLabel 的核心定位
QLabel 是 Qt 中最核心、最常用的纯展示型控件,它的设计初衷就是 "单纯地展示内容",默认没有复杂的交互逻辑(但可以通过配置拓展轻量交互)。它的核心功能可以用一句话概括:
显示文本(支持纯文本、富文本、Markdown)和图片(QPixmap),并提供丰富的样式控制属性(对齐、换行、缩进、边距等)。
在实际开发中,QLabel 的使用场景非常广泛,比如:
- 显示界面标题、提示语、说明文字;
- 显示用户头像、产品图片、背景图;
- 显示表单标签(如 "用户名:""密码:");
- 显示超链接(如 "点击访问官网")。
1.2 QLabel 的继承关系
QLabel 并不是一个 "孤立" 的控件,它有一个清晰的继承链条:
QLabel → QFrame(框架控件) → QWidget(所有控件的基类)
我用一个通俗的 "家具类比" 来解释这个继承关系,方便你理解:
- QWidget :就像 "所有家具的基类",它定义了所有家具都有的通用能力 ------ 比如 "能放在房间里""有大小和位置""能被看到""能设置背景颜色"。对应到 Qt 中,QWidget 定义了所有控件都有的通用属性和方法 ------ 比如
geometry(位置和大小)、styleSheet(样式表)、font(字体)、setVisible()(显示 / 隐藏)等,这些属性和方法 QLabel 都能直接使用,用法和其他控件完全一致,本文就不再重复讲解这些通用属性了,重点放在 QLabel 独有的、和展示逻辑相关的属性上。 - QFrame :就像 "带边框的家具基类",它继承自 QWidget,并且新增了 "边框样式" 的能力 ------ 比如可以设置矩形边框、面板边框、水平线、垂直线等。对应到 Qt 中,QFrame 定义了
frameShape(边框形状)、frameShadow(边框阴影)、lineWidth(边框线宽)等属性,这些属性 QLabel 也能直接使用,比如给 QLabel 加一个矩形边框,能让文本和图片的显示边界更清晰。 - QLabel:就像 "专门用来展示内容的告示牌",它继承自 QFrame 和 QWidget,并且新增了 "展示文本和图片" 的核心能力,以及一系列控制展示效果的属性 ------ 比如文本格式、图片拉伸、对齐方式、自动换行等,这些就是我们本文要重点讲解的内容。
这个继承层级,我们在 Qt Designer 的控件列表中也能直观地看到。
1.3 继承关系带来的两个核心结论
理解了继承关系,我们就能得出两个非常重要的结论,这两个结论能帮我们少走很多弯路,还能快速复用之前的知识:
- QWidget 和 QFrame 的所有属性、方法,QLabel 都能用 :之前我们学过的 QPushButton、QWidget 的通用属性(比如
font、styleSheet、setGeometry()、setStyleSheet()等),QLabel 都能直接使用,用法完全一致 ------ 比如给 QLabel 设置字体用setFont(),设置样式表用setStyleSheet(),和 QPushButton 一模一样。 - Qt 的 API 设计风格非常统一 :所有属性的访问方式都是一样的 ------
- 获取属性值 :如果是布尔类型的属性,调用「is 属性名 ()」方法(比如
isVisible());如果是其他类型,调用「属性名 ()」方法(比如text()、font()); - 设置属性值 :调用「set 属性名 (参数)」方法(比如
setText()、setFont())。
- 获取属性值 :如果是布尔类型的属性,调用「is 属性名 ()」方法(比如
记住这两个结论,我们接下来的学习就会轻松很多!
第二章 QLabel 文本展示核心属性详解(text、textFormat)
文本展示是 QLabel 最基础、最常用的功能,Qt 为 QLabel 提供了两个核心属性来控制文本展示:text(文本内容)和 textFormat(文本格式)。这两个属性是 QLabel 实现文本展示的基础,我们先从它们讲起。
2.1 属性一:text(文本内容)------ QLabel 文本展示的基础
2.1.1 属性的核心定义
text 属性用于定义 QLabel 控件显示的文本内容,是 QLabel 实现文本展示的核心基础属性。
通俗理解:text 就像 "告示牌上写的字"------ 你写什么,QLabel 就显示什么;你不写,QLabel 就显示空白(空字符串)。文本内容的解析规则由 textFormat 属性决定(我们后面会讲),未设置 textFormat 时,Qt 默认会自动识别文本格式。
这里有一个非常重要的点需要注意:如果同时设置了 text(文本)和 pixmap(图片)属性,图片会覆盖文本显示------ 也就是说,QLabel 无法同时显示文本和图片(除非你用布局叠加两个 QLabel,一个显示文本,一个显示图片)。
2.1.2 数据类型
QString 类型,这是 Qt 中专门用来处理字符串的类,支持 Unicode 字符,可以显示中文、英文、数字、特殊符号等各种字符。
2.1.3 关联 API 详解(逐词逐句,零模糊)
text 属性的操作 API 遵循 Qt 统一设计风格,支持获取当前文本、设置新文本两种核心操作:
1. 获取当前文本:QString text () const
函数原型:
QString QLabel::text() const;
逐词逐句底层解析:
QString:函数的返回值类型,返回 QLabel 当前显示的文本内容;QLabel:::说明这个函数是QLabel类的成员函数,只能用 QLabel 对象调用;text():函数名,很直观,就是 "获取文本" 的意思;const:说明这个函数是常成员函数 ------ 它只会读取 QLabel 的文本内容,不会修改 QLabel 的任何状态,所以你可以在const的成员函数里调用它,提高代码的安全性和正确性。
返回值说明:
- 返回
QString类型的字符串,表示 QLabel 当前显示的文本内容; - 如果 QLabel 没有设置过文本,返回空字符串(
QString("")); - 如果 QLabel 设置了图片(
pixmap),文本会被覆盖,但text()仍然会返回之前设置的文本内容(只是界面上不显示)。
调用示例:
// 获取 QLabel 当前显示的文本,并存储到变量中
QString currentText = ui->label->text();
// 可以用 qDebug() 打印出来,方便调试
qDebug() << "QLabel 当前文本:" << currentText;
2. 设置新文本:void setText (const QString &text)
函数原型:
void QLabel::setText(const QString &text);
逐词逐句底层解析:
void:函数没有返回值,只是执行 "设置文本" 的操作;QLabel:::同样说明这是 QLabel 的成员函数;setText():函数名,"设置文本" 的意思;const QString &text:函数的入参,text是要设置的新文本内容;这里用了const QString &(常量引用),是 Qt 中传递字符串的标准方式 ------ 既避免了拷贝字符串的开销,又保证了不会修改传入的原始字符串。
参数说明:
text:要设置的新文本内容,QString类型;- 支持普通字符、包含 HTML/Markdown 标签的字符串(但需要配合
textFormat属性才能正确解析); - 如果传入空字符串(
QString("")),会清空 QLabel 的文本显示,仅保留空白的控件区域。
生效规则:
- 调用后立即生效,QLabel 会根据
textFormat的配置重新解析并显示文本; - 如果之前设置了图片(
pixmap),设置文本后不会自动清空图片 ------ 图片仍然会覆盖文本,需要手动调用setPixmap(QPixmap())清空图片,文本才会显示出来。
调用示例:
// 示例1:显示普通纯文本
ui->label->setText("Hello Qt! 这是一段普通的纯文本。");
// 示例2:显示包含 HTML 标签的文本(需配合 textFormat=Qt::RichText 解析)
ui->label->setText("<h3 style='color:red;'>这是一段红色的富文本标题</h3>");
// 示例3:清空文本显示
ui->label->setText("");
2.1.4 典型代码示例(两个实用场景,一看就懂)
示例一:动态更新提示文本
这个场景非常常用,比如用户点击按钮后,QLabel 动态更新提示语:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 初始设置提示文本
ui->label->setText("请点击下方按钮");
// 关联按钮的点击信号,动态更新 QLabel 文本
connect(ui->pushButton, &QPushButton::clicked, this, [=]() {
// 点击按钮后,更新提示文本
ui->label->setText("你点击了按钮!这是更新后的提示文本。");
// 可以用 qDebug() 打印当前文本,验证是否更新成功
qDebug() << "更新后的文本:" << ui->label->text();
});
}
Widget::~Widget()
{
delete ui;
}
示例二:文本与图片切换显示
这个场景也很常用,比如点击按钮切换 QLabel 显示文本或图片:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QPushButton>
#include <QPixmap>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 初始显示文本
ui->label->setText("这是初始文本,点击按钮切换为图片");
// 给 QLabel 加个边框,方便看清楚边界
ui->label->setStyleSheet("QLabel { border: 1px solid gray; }");
// 关联按钮的点击信号,切换文本和图片
bool isTextMode = true; // 标记当前是否是文本模式
connect(ui->pushButton, &QPushButton::clicked, this, [=]() mutable {
if (isTextMode) {
// 切换为图片模式:先加载图片,再设置到 QLabel
QPixmap pixmap(":/images/logo.png"); // 从 qrc 资源加载图片
ui->label->setPixmap(pixmap);
// 注意:设置图片后,文本会被覆盖,但 text() 仍能获取到之前的文本
qDebug() << "切换为图片模式,当前文本(未显示):" << ui->label->text();
} else {
// 切换为文本模式:先清空图片,再设置文本
ui->label->setPixmap(QPixmap()); // 传入空的 QPixmap,清空图片
ui->label->setText("这是文本模式,点击按钮切换为图片");
qDebug() << "切换为文本模式,当前文本:" << ui->label->text();
}
// 切换模式标记
isTextMode = !isTextMode;
});
}
Widget::~Widget()
{
delete ui;
}
2.1.5 关键注意事项与新手必踩的坑(100% 避坑指南)
text 属性看起来简单,但新手很容易踩坑,我把最常见的几个坑列出来,每个都讲清楚 "为什么错""怎么改":
坑点一:设置了文本,但界面上不显示,只显示图片
问题描述 :新手先设置了文本,然后设置了图片,结果发现界面上只显示图片,不显示文本,以为是 setText() 没生效。
原因分析 :这是正常的!QLabel 的设计逻辑是**"图片优先"** ------ 如果同时设置了 text 和 pixmap,图片会完全覆盖文本,文本不会显示在界面上;但 text() 函数仍然会返回之前设置的文本内容(只是界面上不显示)。
解决方式 :如果要显示文本,必须先清空图片 ------ 调用 setPixmap(QPixmap())(传入一个空的 QPixmap 对象),然后再设置文本,或者先设置文本,再设置图片(但这样文本会被覆盖)。
坑点二:设置了包含 HTML 标签的文本,但标签被原样显示,没有解析
问题描述 :新手设置了类似 <b>加粗</b> 的文本,结果界面上原样显示了 <b>加粗</b>,而不是加粗的文字,以为是 Qt 不支持 HTML。
原因分析 :这是因为没有设置 textFormat 属性!默认情况下,Qt 会用 Qt::AutoText 自动识别文本格式,但对于简单的 HTML 标签,有时候会识别失败,或者被当成纯文本处理。
解决方式 :显式设置 textFormat 属性为 Qt::RichText------ 这样 Qt 就会强制按富文本模式解析 HTML 标签,我们后面会详细讲 textFormat 属性。
坑点三:设置了空字符串,但 QLabel 仍然占用界面空间
问题描述 :新手设置了 setText("") 清空文本,结果发现 QLabel 仍然在界面上占用一块空白空间,没有消失,以为是 setText("") 没生效。
原因分析 :这是正常的!setText("") 只是清空了 QLabel 的文本内容,并没有隐藏 QLabel 控件本身 ------QLabel 仍然在界面上,仍然占用布局空间,只是显示空白。
解决方式 :如果要让 QLabel 完全消失,不占用界面空间,需要调用 setVisible(false) 隐藏控件,或者从布局中移除 QLabel;如果只是想清空文本,保留控件位置,用 setText("") 就可以了。
2.2 属性二:textFormat(文本格式)------ 控制文本解析规则的核心
讲完了 text(文本内容),我们再讲 textFormat(文本格式)------ 这个属性是用来告诉 Qt"我设置的文本是什么格式的,你该怎么解析它",是 QLabel 实现富文本、Markdown 展示的核心。
2.2.1 属性的核心定义
textFormat 属性用于指定 QLabel 解析 text 属性内容的规则,决定文本是否支持 HTML 富文本、Markdown 语法,默认值为 Qt::AutoText(自动识别格式)。
通俗理解:textFormat 就像 "告示牌的内容编辑器"------ 你告诉编辑器 "我写的是纯文本",它就原样显示;你告诉编辑器 "我写的是 HTML 富文本",它就解析 HTML 标签,显示加粗、变色的文字;你告诉编辑器 "我写的是 Markdown",它就解析 Markdown 语法,显示标题、列表。
这里有一个非常重要的点:textFormat 必须和 text 配合使用 ------ 只有设置了正确的 textFormat,text 中的格式化标签才会被正确解析;如果 textFormat 设置错误,格式化标签会被原样显示,或者解析失败。
2.2.2 数据类型
Qt::TextFormat 枚举类型,这是 Qt 中专门用来定义文本解析格式的枚举,包含四个常用值:Qt::PlainText(纯文本)、Qt::RichText(富文本)、Qt::MarkdownText(Markdown 文本)、Qt::AutoText(自动识别)。
2.2.3 枚举值详解
为了让你更清楚地理解每个枚举值的区别,我做了一个对比表格:
| 枚举值 | 核心功能 | 适用场景 | 示例效果(输入 vs 输出) |
|---|---|---|---|
| Qt::PlainText | 纯文本模式 :忽略所有 HTML/Markdown 标签,按原始字符原样显示;比如输入 <b>加粗</b>,显示为普通字符串 <b>加粗</b>,不会加粗。 |
展示用户输入的原始文本、包含特殊符号的文本(如代码片段、用户评论)。 | 输入:<b>加粗</b>输出:<b>加粗</b>(原样显示) |
| Qt::RichText | 富文本模式 :完整支持 HTML 标签解析,可实现文本加粗、变色、换行、超链接等效果;支持的核心标签:<b>/<strong>(加粗)、<i>(斜体)、<font color='xxx'>(文字颜色)、<br>(换行)、<a href='url'>(超链接)。 |
展示格式化的静态文本(如标题、带样式的提示语、帮助文档)。 | 输入:<b>加粗</b>输出:加粗(文字加粗) |
| Qt::MarkdownText | Markdown 模式 :支持 Markdown 语法解析(Qt 5.14+ 版本才支持 );支持的核心语法:##(二级标题)、**加粗**、*斜体*、[链接文本](url)(超链接)。 |
展示基于 Markdown 编写的文本内容(如说明文档、博客摘要)。 | 输入:## 二级标题加粗`输出:(显示二级标题和加粗文字) |
| Qt::AutoText | 自动识别模式 :Qt 自动检测 text 内容,若包含 HTML/Markdown 标签则按对应格式解析,否则按纯文本解析;优点:无需手动指定格式,适配性强;缺点:复杂的格式化标签可能识别失败。 |
不确定文本是否包含格式化标签的通用场景(最常用,默认值)。 | 输入:<b>加粗</b>输出:加粗(自动识别为富文本) |
2.2.4 关联 API 详解
textFormat 属性的操作 API 同样遵循 Qt 统一设计风格:
1. 获取当前文本格式:Qt::TextFormat textFormat () const
函数原型:
Qt::TextFormat QLabel::textFormat() const;
逐词逐句底层解析:
Qt::TextFormat:返回值类型,返回 QLabel 当前的文本解析格式;QLabel:::说明这是 QLabel 的成员函数;textFormat():函数名,"获取文本格式" 的意思;const:常成员函数,只读取不修改。
返回值说明:
- 返回
Qt::TextFormat枚举值,默认返回Qt::AutoText; - 可以用
qDebug()打印出来,但会显示枚举的整数值,需要自己对应枚举值。
调用示例:
// 获取当前文本格式
Qt::TextFormat currentFormat = ui->label->textFormat();
// 打印出来验证(默认是 Qt::AutoText,对应整数值 4)
qDebug() << "当前文本格式(枚举值):" << currentFormat;
2. 设置文本格式:void setTextFormat (Qt::TextFormat format)
函数原型:
void QLabel::setTextFormat(Qt::TextFormat format);
逐词逐句底层解析:
void:无返回值;QLabel:::成员函数;setTextFormat():函数名,"设置文本格式" 的意思;Qt::TextFormat format:入参,format是要设置的文本解析格式枚举值。
参数说明:
format:要设置的文本解析格式,Qt::TextFormat枚举值,常用Qt::PlainText、Qt::RichText、Qt::AutoText;- 注意:
Qt::MarkdownText仅在 Qt 5.14 及以上版本支持,低版本使用会自动降级为Qt::PlainText。
生效规则:
- 调用后立即生效,但需要重新调用
setText()(或刷新界面),新格式才会对当前文本生效; - 建议的调用顺序:先设置
textFormat,再设置text------ 这样文本会直接按新格式解析,无需刷新。
调用示例:
// 示例1:设置为富文本模式,解析 HTML 标签
ui->label->setTextFormat(Qt::RichText); // 先设置格式
ui->label->setText("<font color='blue' size='5'>蓝色大标题</font><br><b>加粗文本</b>"); // 再设置文本
// 示例2:设置为纯文本模式,原样显示 HTML 标签
ui->label->setTextFormat(Qt::PlainText);
ui->label->setText("<font color='blue'>蓝色文本</font>"); // 输出:<font color='blue'>蓝色文本</font>(原样显示)
// 示例3:设置为自动识别模式(默认,无需手动设置)
ui->label->setTextFormat(Qt::AutoText);
ui->label->setText("<b>自动识别富文本</b>"); // 自动解析为加粗
text以及format的示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK,那么本文件我们来学习QLabel的text属性和textFormat属性,text属性我们已经很熟悉了,就是设置该标签控件的显示的内容是什么
//而textFormat属性,其实也是和text属性相关的,那就是我们要通过设置它,来让qt知道我们设置的text内容是什么类型的文本,即文本的格式
//因为有可能我们会输入html文本的格式,也可能会输入markdown文本的格式,所以这就得让qt知道,这样子它才能正常表示出来文本
/**
* @property QLabel::text
* @brief QLabel的文本内容属性
* @details 该属性用于定义QLabel控件显示的文本内容,是QLabel实现文本展示的核心基础属性;
* 文本内容的解析规则由textFormat属性决定(纯文本/富文本/Markdown),未设置时默认显示空字符串,设置后会立即刷新QLabel的界面展示效果;
* 若同时设置了pixmap(图片)属性,图片会覆盖文本显示(文本和图片无法同时展示)。
*
* 【关联API详解】
* 1. QString text() const
* - 功能:获取QLabel当前显示的文本内容
* - 返回值:QString类型,空字符串表示未设置文本
* - 调用示例:
* QString currentText = ui->label->text(); // 读取标签当前文本
*
* 2. void setText(const QString &text)
* - 功能:设置QLabel要显示的文本内容
* - 参数:text - 待显示的字符串,支持普通字符、包含HTML/Markdown标签的字符串(需配合textFormat解析)
* - 生效规则:调用后立即生效,QLabel会根据textFormat的配置重新解析并显示文本
* - 调用示例:
* ui->label->setText("普通纯文本"); // 显示基础文本
* ui->label->setText("<h2 style='color:red;'>富文本标题</h2>"); // 需配合textFormat=RichText解析
*
* 【关键注意事项】
* 1. 文本覆盖:设置pixmap后,文本会被图片覆盖,需清空pixmap(setPixmap(QPixmap()))才能重新显示文本;
* 2. 空文本处理:setText("")会清空QLabel的文本显示,仅保留空白的控件区域。
*
* ---
*
* @property QLabel::textFormat
* @brief QLabel的文本格式解析属性
* @details 该属性用于指定QLabel解析text属性内容的规则,决定文本是否支持HTML富文本、Markdown语法,
* 核心作用是区分"纯文本展示"和"格式化文本展示",默认值为Qt::AutoText(自动识别格式)。
*
* 【枚举值详解(Qt::TextFormat)】
* QLabel通过Qt::TextFormat枚举值控制文本解析逻辑,各枚举值的通俗说明如下:
* | 枚举值 | 核心功能 | 适用场景 |
* |---------------------|--------------------------------------------------------------------------|------------------------------|
* | Qt::PlainText | 纯文本模式:忽略所有HTML/Markdown标签,按原始字符原样显示;<br>例:输入"<b>加粗</b>",显示为普通字符串"<b>加粗</b>" | 展示用户输入的原始文本、包含特殊符号的文本 |
* | Qt::RichText | 富文本模式:完整支持HTML标签解析,可实现文本加粗、变色、换行、超链接等效果;<br>支持的核心标签:<br>✅ <b>/<strong>(加粗)、<i>(斜体)<br>✅ <font color='xxx'>(文字颜色)<br>✅ <br>(换行)、<a href='url'>(超链接) | 展示格式化的静态文本(如标题、带样式的提示语) |
* | Qt::MarkdownText | Markdown模式:支持Markdown语法解析(Qt 5.14+版本支持);<br>支持的核心语法:<br>✅ ##(二级标题)、**加粗**、*斜体*<br>✅ [链接文本](url)(超链接) | 展示基于Markdown编写的文本内容 |
* | Qt::AutoText | 自动识别模式:Qt自动检测text内容,若包含HTML/Markdown标签则按对应格式解析,否则按纯文本解析;<br>优点:无需手动指定格式,适配性强 | 不确定文本是否包含格式化标签的通用场景 |
*
* 【关联API详解】
* 1. Qt::TextFormat textFormat() const
* - 功能:获取QLabel当前的文本解析格式
* - 返回值:Qt::TextFormat枚举值,默认返回Qt::AutoText
* - 调用示例:
* Qt::TextFormat format = ui->label->textFormat();
*
* 2. void setTextFormat(Qt::TextFormat format)
* - 功能:设置QLabel的文本解析格式
* - 参数:format - Qt::TextFormat枚举值,常用Qt::PlainText/Qt::RichText
* - 生效规则:设置后需重新调用setText()(或刷新界面),新格式才会生效
* - 调用示例:
* // 设置为富文本模式,解析HTML标签
* ui->label->setTextFormat(Qt::RichText);
* ui->label->setText("<font color='blue'>蓝色文本</font>");
*
* // 设置为纯文本模式,原样显示HTML标签
* ui->label->setTextFormat(Qt::PlainText);
* ui->label->setText("<font color='blue'>蓝色文本</font>"); // 显示为原始字符串
*
* 【关键注意事项】
* 1. 版本兼容:Qt::MarkdownText仅在Qt 5.14及以上版本支持,低版本使用会自动降级为Qt::PlainText;
* 2. 性能考量:RichText模式解析复杂HTML会略耗性能,纯展示普通文本时建议使用Qt::PlainText;
* 3. 自动识别限制:Qt::AutoText仅能识别基础HTML标签,复杂Markdown语法可能无法自动识别,需手动设置Qt::MarkdownText;
* 4. 特殊字符转义:PlainText模式下,特殊字符(如&、<、>)无需转义;RichText模式下需用实体字符(如&表示&,<表示<)。
*
* 【典型使用示例】
* ===================================== 示例1:富文本展示 =====================================
* ui->label->setTextFormat(Qt::RichText);
* ui->label->setText(
* "<h3>QLabel富文本示例</h3>"
* "<p>这是<b>加粗</b>文本,这是<i>斜体</i>文本</p>"
* "<p><a href='https://www.qt.io'>Qt官网</a></p>"
* );
*
* ===================================== 示例2:纯文本展示(避免标签解析) =====================================
* // 展示用户输入的包含HTML标签的文本,避免被误解析
* QString userInput = "<script>test</script>"; // 模拟用户输入的特殊文本
* ui->label->setTextFormat(Qt::PlainText);
* ui->label->setText(userInput); // 原样显示"<script>test</script>"
*/
QLabel* label=new QLabel(this);
label->move(0,100);
label->setText("this is label");
label->setTextFormat(Qt::PlainText);//指明文本内容为纯文本
QLabel* label1=new QLabel(this);
label1->move(0,300);
label1->setText("<b>this is label1<\b>");
label1->setTextFormat(Qt::RichText);//指明文本内容为富文本,也就是html格式
QLabel* label2=new QLabel(this);
label2->move(0,500);
label2->setText("#this is label2");
label2->setTextFormat(Qt::MarkdownText);//指明文本内容为markdown文本
//那么一般来说,qt默认是设置textFormat属性为Qt::AutoText属性的,也就是根据文本内容自动决定文本格式,最方便了~~~
}
Widget::~Widget()
{
delete ui;
}
2.2.5 典型代码示例(三个实用场景,一看就懂)
示例一:显示不同格式的文本对比
这个场景可以直观地看到不同 textFormat 的效果:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建一个垂直布局,方便放置三个 QLabel
QVBoxLayout *layout = new QVBoxLayout(this);
// 1. 纯文本模式的 QLabel
QLabel *plainLabel = new QLabel(this);
plainLabel->setTextFormat(Qt::PlainText);
plainLabel->setText("【纯文本模式】<b>加粗</b> <font color='red'>红色</font>");
plainLabel->setStyleSheet("QLabel { border: 1px solid gray; padding: 5px; margin: 5px; }");
layout->addWidget(plainLabel);
// 2. 富文本模式的 QLabel
QLabel *richLabel = new QLabel(this);
richLabel->setTextFormat(Qt::RichText);
richLabel->setText("【富文本模式】<b>加粗</b> <font color='red'>红色</font>");
richLabel->setStyleSheet("QLabel { border: 1px solid gray; padding: 5px; margin: 5px; }");
layout->addWidget(richLabel);
// 3. 自动识别模式的 QLabel
QLabel *autoLabel = new QLabel(this);
autoLabel->setTextFormat(Qt::AutoText);
autoLabel->setText("【自动识别模式】<b>加粗</b> <font color='red'>红色</font>");
autoLabel->setStyleSheet("QLabel { border: 1px solid gray; padding: 5px; margin: 5px; }");
layout->addWidget(autoLabel);
// 效果:plainLabel 原样显示标签,richLabel 和 autoLabel 显示加粗和红色文字
}
Widget::~Widget()
{
delete ui;
}
示例二:显示用户输入的原始文本(避免标签解析)
这个场景非常重要,比如展示用户输入的评论、代码片段,必须用 Qt::PlainText 避免用户输入的 HTML 标签被误解析:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 假设界面上有一个 QLineEdit(用户输入框)、一个 QPushButton(确认按钮)、一个 QLabel(显示输入内容)
// 关联确认按钮的点击信号
connect(ui->pushButton_confirm, &QPushButton::clicked, this, [=]() {
// 获取用户输入的内容
QString userInput = ui->lineEdit_input->text();
// 关键设置:必须用 Qt::PlainText,避免用户输入的 HTML 标签被误解析
ui->label_output->setTextFormat(Qt::PlainText);
// 显示用户输入的原始内容
ui->label_output->setText("用户输入的原始内容:\n" + userInput);
// 比如用户输入 "<script>alert('test')</script>",会原样显示,不会被解析
});
}
Widget::~Widget()
{
delete ui;
}
示例三:显示 Markdown 文本(Qt 5.14+)
这个场景适合展示基于 Markdown 编写的说明文档:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 注意:Qt::MarkdownText 仅在 Qt 5.14 及以上版本支持
ui->label->setTextFormat(Qt::MarkdownText);
// 设置 Markdown 格式的文本
ui->label->setText(
"## QLabel Markdown 示例\n"
"这是一段 **加粗** 的文本,这是一段 *斜体* 的文本。\n"
"### 支持的语法\n"
"- 列表项 1\n"
"- 列表项 2\n"
"[点击访问 Qt 官网](https://www.qt.io)"
);
ui->label->setWordWrap(true); // 开启自动换行,适配长文本
ui->label->setStyleSheet("QLabel { padding: 10px; }");
}
Widget::~Widget()
{
delete ui;
}
2.2.6 关键注意事项与新手必踩的坑(100% 避坑指南)
坑点一:使用 Qt::MarkdownText,但文本没有被解析,还是原样显示
问题描述 :新手设置了 Qt::MarkdownText,但 Markdown 语法没有被解析,还是原样显示,以为是 Qt 不支持 Markdown。
原因分析:有两个可能的原因:
- Qt 版本太低 :
Qt::MarkdownText仅在 Qt 5.14 及以上版本支持,Qt 5.13 及以下版本使用会自动降级为Qt::PlainText,Markdown 语法不会被解析; - 调用顺序错误 :先设置了
text,再设置textFormat------ 新格式不会对已设置的文本生效,需要重新调用setText()。解决方式: - 检查 Qt 版本,确保是 Qt 5.14 及以上;
- 调整调用顺序:先设置
textFormat,再设置text,或者设置完textFormat后重新调用setText()。
坑点二:RichText 模式下,特殊字符(如 &、<、>)显示错误
问题描述 :新手在 RichText 模式下设置了包含 &、<、> 的文本,结果这些字符显示错误,或者导致 HTML 解析失败。
原因分析 :在 RichText 模式下,&、<、> 是 HTML 的特殊字符,有特殊含义(比如 < 表示 <),如果直接输入这些字符,会被 Qt 当成 HTML 标签的一部分,导致解析错误。解决方式:在 RichText 模式下,如果要显示这些特殊字符,需要用 HTML 实体字符转义:
&→&<→<>→>"→"或者直接用Qt::PlainText模式,就不需要转义了。
坑点三:AutoText 模式下,复杂的格式化标签识别失败
问题描述 :新手用 Qt::AutoText 模式,设置了复杂的 HTML 或 Markdown 标签,结果标签没有被正确解析,以为是 Qt 的 bug。
原因分析 :Qt::AutoText 的自动识别能力是有限的 ------ 它只能识别基础的 HTML 标签(如 <b>、<br>),复杂的 HTML 标签(如 <table>、<div>)或复杂的 Markdown 语法(如代码块、表格)可能无法自动识别,导致解析失败。
解决方式 :如果文本包含复杂的格式化标签,不要用 Qt::AutoText ,显式设置 textFormat 为 Qt::RichText 或 Qt::MarkdownText,这样 Qt 会强制按对应格式解析,识别成功率更高。
第三章 QLabel 图片展示核心属性详解(pixmap、scaledContents)
除了文本展示,图片展示也是 QLabel 的核心功能之一,Qt 为 QLabel 提供了两个核心属性来控制图片展示:pixmap(图片内容)和 scaledContents(内容拉伸适配)。这两个属性是 QLabel 实现图片展示的基础,我们接下来详细讲解。
3.1 前置知识:QPixmap 类 ------ Qt 中处理位图的核心类
在讲 pixmap 属性之前,我们必须先简单了解一下 QPixmap 类 ------ 因为 pixmap 属性的类型就是 QPixmap,它是 Qt 中专门用来处理位图的核心渲染类。
3.1.1 QPixmap 的核心定位
QPixmap 是 Qt 提供的专门用于屏幕显示优化的位图处理类,核心作用是加载、存储、操作位图图像,并高效渲染到屏幕(如 QLabel、QPushButton 等控件)。
通俗理解:QPixmap 就像 "专门用来在屏幕上画画的画布"------ 它针对屏幕显示做了深度优化(比如利用系统显卡缓存),绘制到界面时效率远高于 QImage(另一个 Qt 图片处理类,侧重像素级操作),是 Qt 界面中展示图片的首选类。
3.1.2 QPixmap 与 QImage 的核心区别(必知)
为了让你更清楚地理解什么时候用 QPixmap,什么时候用 QImage,我做了一个对比表格:
| 特性 | QPixmap | QImage |
|---|---|---|
| 核心用途 | 屏幕显示(渲染优化) | 像素级编辑(修改 RGB/Alpha 通道) |
| 内存布局 | 适配显卡缓存(平台相关) | 统一内存布局(平台无关) |
| 像素访问 | 需转换为 QImage 才能高效访问 | 可直接读写每个像素 |
| 绘制效率 | 绘制到界面快 | 绘制到界面慢(需转换为 QPixmap) |
| 适用场景 | 展示图片、控件背景、界面渲染 | 图片编辑、像素处理、格式转换 |
简单总结:如果只是要展示图片,用 QPixmap;如果要修改图片的像素(比如把图片变红、加滤镜),用 QImage,修改完再转换为 QPixmap 展示。
3.1.3 QPixmap 的核心构造函数与常用函数(快速入门)
这里我们简单介绍一下 QLabel 中最常用的 QPixmap 构造函数和函数,足够满足图片展示的需求:
1. 从文件路径加载图片的构造函数
QPixmap::QPixmap(const QString &fileName, const char *format = nullptr, Qt::ImageConversionFlags flags = Qt::AutoColor);
-
功能:直接从本地文件或 Qt 资源文件加载图片创建 QPixmap;
-
参数说明 :
fileName:图片路径 ------ 本地路径如"D:/test.png",Qt 资源路径如":/images/logo.png"(注意 Qt 资源路径以:开头);format:指定图片格式(如"png"、"jpg"),默认nullptr自动识别;flags:颜色转换标志,默认Qt::AutoColor即可;
-
示例 :
// 从 Qt 资源加载 PNG 图片 QPixmap pix(":/images/avatar.png"); // 从本地文件加载 JPG 图片 QPixmap pix2("D:/photo.jpg");
2. 缩放图片的函数:scaled ()
QPixmap QPixmap::scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const;
-
功能:返回缩放后的新 QPixmap(原对象不变),是 QPixmap 最常用的缩放接口;
-
参数详解(通俗版) :
size:目标尺寸(如QSize(200, 200));aspectRatioMode:比例模式(非常重要,决定图片是否变形):Qt::IgnoreAspectRatio:忽略比例,强制拉伸至目标尺寸(图片可能变形);Qt::KeepAspectRatio:保持宽高比,缩放后图片完全包含在目标尺寸内(无变形,推荐);Qt::KeepAspectRatioByExpanding:保持宽高比,缩放后图片完全覆盖目标尺寸(需裁剪);
transformMode:变换模式(决定缩放后的图片是否清晰):Qt::FastTransformation:快速缩放(效率高,低分辨率图片可能模糊);Qt::SmoothTransformation:平滑缩放(效率稍低,图片更清晰,推荐用于高清图);
-
示例 :
QPixmap pix(":/images/big_pic.png"); // 保持比例缩放到 200x200,平滑缩放(无变形,推荐) QPixmap scaledPix = pix.scaled(200, 200, Qt::KeepAspectRatio, Qt::SmoothTransformation);
3. 判断图片是否加载成功的函数:isNull ()
bool QPixmap::isNull() const;
-
功能:判断 QPixmap 是否为空(无图片数据,比如路径错误导致加载失败);
-
返回值 :
true表示为空,false表示加载成功; -
示例 :
QPixmap pix(":/images/test.png"); if (pix.isNull()) { qDebug() << "图片加载失败!请检查路径是否正确。"; } else { qDebug() << "图片加载成功!尺寸:" << pix.size(); }
关于 QPixmap 的更多内容,我们就不深入讲解了,以上内容足够满足 QLabel 图片展示的需求。接下来我们回到 QLabel 的 pixmap 属性。
3.2 属性三:pixmap(图片内容)------ QLabel 图片展示的基础
3.2.1 属性的核心定义
pixmap 属性用于定义 QLabel 控件显示的图片内容,是 QLabel 实现图片展示的核心基础属性。
通俗理解:pixmap 就像 "贴在告示牌上的画"------ 你贴什么画,QLabel 就显示什么画;你不贴,QLabel 就显示文本或空白。
这里有两个非常重要的点需要注意:
- 图片优先 :如果同时设置了
text(文本)和pixmap(图片),图片会完全覆盖文本,文本不会显示在界面上(但text()仍能获取到之前设置的文本); - 初始尺寸 :设置图片后,图片初始按原始像素尺寸显示 ------ 如果图片尺寸大于 QLabel 控件范围,超出部分会被裁剪;如果图片尺寸小于 QLabel 控件范围,图片会居中显示(对齐方式由
alignment控制)。
3.2.2 数据类型
QPixmap 类型,就是我们刚才讲的 Qt 位图处理类。
3.2.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前图片:const QPixmap* pixmap () const
函数原型:
const QPixmap* QLabel::pixmap() const;
逐词逐句底层解析:
const QPixmap*:返回值类型,返回 QLabel 当前显示的图片对象的常量指针------ 常量指针表示不能通过这个指针修改图片对象;QLabel:::成员函数;pixmap():函数名,"获取图片" 的意思;const:常成员函数。
返回值说明:
- 返回
const QPixmap*类型的指针 ------ 非空指针表示当前显示图片,nullptr表示未设置图片; - 注意:返回的是指针,使用前要判断是否为
nullptr,避免空指针异常。
调用示例:
// 获取当前图片
const QPixmap* currentPix = ui->label->pixmap();
if (currentPix) {
// 图片不为空,打印尺寸
qDebug() << "当前图片尺寸:" << currentPix->size();
} else {
qDebug() << "当前未设置图片";
}
2. 设置图片:void setPixmap (const QPixmap &pixmap)
函数原型:
void QLabel::setPixmap(const QPixmap &pixmap);
逐词逐句底层解析:
void:无返回值;QLabel:::成员函数;setPixmap():函数名,"设置图片" 的意思;const QPixmap &pixmap:入参,pixmap是要设置的图片对象,用常量引用传递,避免拷贝开销。
参数说明:
pixmap:要设置的图片对象,QPixmap类型;- 如果传入空的 QPixmap 对象(
QPixmap()),会清空 QLabel 的图片显示,恢复文本显示(如果之前设置了文本)。
生效规则:
- 调用后立即生效,图片初始按原始尺寸显示(是否拉伸由
scaledContents控制); - 如果之前设置了文本,设置图片后文本会被覆盖,但不会被清空。
调用示例:
// 示例1:从 Qt 资源加载图片并设置到 QLabel
QPixmap pix(":/images/logo.png");
if (!pix.isNull()) { // 先判断是否加载成功
ui->label->setPixmap(pix);
}
// 示例2:清空图片,恢复文本显示
ui->label->setPixmap(QPixmap()); // 传入空的 QPixmap
ui->label->setText("图片已清空,这是恢复的文本");
3.2.4 典型代码示例(两个实用场景,一看就懂)
示例一:加载并显示图片(基础版)
这个场景是 QLabel 图片展示的最基础用法:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QPixmap>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1. 加载图片(从 Qt 资源或本地文件)
QPixmap pixmap(":/images/huaji.png"); // 假设 qrc 中有这张图片
// 2. 先判断图片是否加载成功(非常重要,避免空指针)
if (pixmap.isNull()) {
qDebug() << "图片加载失败!请检查 qrc 路径或本地路径是否正确。";
ui->label->setText("图片加载失败");
return;
}
// 3. 打印图片原始尺寸,方便调试
qDebug() << "图片原始尺寸:" << pixmap.size();
// 4. 设置 QLabel 的大小和图片原始尺寸一样(可选)
ui->label->setFixedSize(pixmap.size());
// 5. 设置图片到 QLabel
ui->label->setPixmap(pixmap);
// 此时图片按原始尺寸显示,如果图片比 QLabel 大,超出部分会被裁剪
}
Widget::~Widget()
{
delete ui;
}
示例二:加载、缩放并显示图片(保持比例,无变形)
这个场景更实用,因为通常图片尺寸和 QLabel 尺寸不一致,我们需要保持比例缩放,避免图片变形:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QPixmap>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1. 先固定 QLabel 的尺寸(比如 300x200)
ui->label->setFixedSize(300, 200);
// 给 QLabel 加个边框,方便看清楚边界
ui->label->setStyleSheet("QLabel { border: 1px solid gray; }");
// 2. 加载图片
QPixmap pixmap(":/images/photo.jpg");
if (pixmap.isNull()) {
qDebug() << "图片加载失败";
return;
}
// 3. 关键步骤:先缩放图片(保持比例,平滑缩放),再设置到 QLabel
// 参数说明:
// - ui->label->size():目标尺寸(QLabel 的尺寸)
// - Qt::KeepAspectRatio:保持宽高比,无变形
// - Qt::SmoothTransformation:平滑缩放,图片更清晰
QPixmap scaledPix = pixmap.scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
// 4. 设置缩放后的图片到 QLabel
ui->label->setPixmap(scaledPix);
// 关闭 scaledContents(因为我们已经手动缩放了图片,不需要 QLabel 再拉伸)
ui->label->setScaledContents(false);
// 此时图片会保持比例,居中显示在 QLabel 中,无变形
}
Widget::~Widget()
{
delete ui;
}
3.3 属性四:scaledContents(内容拉伸适配)------ 控制图片是否填充控件的核心
讲完了 pixmap(图片内容),我们再讲 scaledContents(内容拉伸适配)------ 这个属性是用来控制 QLabel 内的内容(图片 / 文本)是否自动拉伸以填充整个 QLabel 控件区域的,是解决 "图片尺寸与控件尺寸不匹配" 问题的简单方式。
3.3.1 属性的核心定义
scaledContents 属性用于控制 QLabel 内的内容(图片 / 文本)是否自动拉伸以填充整个 QLabel 控件区域,默认值为 false。
通俗理解:scaledContents 就像 "告示牌的画框拉伸功能"------ 如果开启(true),画会被强制拉伸,填满整个画框(但画可能变形 );如果关闭(false),画保持原始尺寸,不拉伸(但画可能超出画框被裁剪,或者比画框小,居中显示)。
这里有两个非常重要的点需要注意:
- 图片变形问题 :开启
scaledContents=true后,图片会强制适配 QLabel 的宽高 ------ 如果 QLabel 的宽高比与图片原始比例不一致,图片会变形(比如原本是正方形的图片,会被拉成长方形); - 文本适配效果不明显:这个属性对文本仅影响行高 / 字间距的适配,不会改变字体大小,文本拉伸效果不明显,主要用于图片。
3.3.2 数据类型
bool 类型,true 表示开启自动拉伸,false 表示关闭(默认)。
3.3.3 关联 API 详解(逐词逐句,零模糊)
1. 获取是否开启拉伸:bool hasScaledContents () const
函数原型:
bool QLabel::hasScaledContents() const;
逐词逐句底层解析:
bool:返回值类型,返回是否开启自动拉伸;QLabel:::成员函数;hasScaledContents():函数名,"是否开启内容拉伸" 的意思;const:常成员函数。
返回值说明:
true表示开启自动拉伸,false表示关闭(默认)。
调用示例:
bool isScaled = ui->label->hasScaledContents();
qDebug() << "是否开启内容拉伸:" << isScaled;
2. 设置是否开启拉伸:void setScaledContents (bool enable)
函数原型:
void QLabel::setScaledContents(bool enable);
逐词逐句底层解析:
void:无返回值;QLabel:::成员函数;setScaledContents():函数名,"设置内容拉伸" 的意思;bool enable:入参,enable是true开启拉伸,false关闭拉伸。
参数说明:
enable:true开启自动拉伸,false关闭拉伸;- 注意:如果已经手动缩放了 QPixmap(比如用
scaled()函数),建议关闭scaledContents(false),避免图片被二次拉伸变形。
生效规则:
- 调用后立即生效,已显示的内容会重新适配控件尺寸;
- 图片拉伸时,对齐方式(
alignment)会失效,图片会填满整个控件。
调用示例:
// 示例1:开启内容拉伸,图片填充整个 QLabel(可能变形)
ui->label->setFixedSize(400, 300);
QPixmap pix(":/images/logo.png");
ui->label->setPixmap(pix);
ui->label->setScaledContents(true); // 开启拉伸,图片填满 400x300(可能变形)
// 示例2:关闭内容拉伸,图片保持原始尺寸(推荐配合手动缩放 QPixmap 使用)
ui->label->setScaledContents(false); // 关闭拉伸
QPixmap scaledPix = pix.scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label->setPixmap(scaledPix); // 显示手动缩放后的图片(无变形)
pixmap以及scaledContents示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QPixmap>
#include <QResizeEvent>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK,那么本文件我们来学习QLabel的pixmap属性和scaledContents属性
//pixmap属性其实我们不陌生,就是设置图片,也就是设置QLabel显示的图片罢了,这需要使用QPixmap类对象
//而scaledContents属性则是和图片相关,当我们设置该属性为true之后,会自动拉伸以填充整个QLabel控件区域,但不是随着我们拉伸QLabel而自动改变
//它是指会自动填充最开始的设置的大小,即如果原本图片比我们设置的QLabel控件区域小的话,那么它会自动拉伸填充,是这么个意思
//要想支持能随着我们后续拉伸QLabel而自动改变,就得重写事件了,下面会解析
//为false则不会~
/**
* @property QLabel::pixmap
* @brief QLabel的图片内容属性
* @details 该属性用于定义QLabel控件显示的图片内容,是QLabel实现图片展示的核心属性;
* 设置图片后会直接覆盖text属性的文本显示(文本和图片无法同时展示),未设置时返回空的QPixmap对象,控件仅显示文本或空白;
* 支持的图片来源包括本地图片文件、qrc资源文件、内存中的QPixmap对象,兼容常见图片格式(JPG/PNG/BMP等)。
*
* 【关联API详解】
* 1. const QPixmap* pixmap() const
* - 功能:获取QLabel当前显示的图片对象指针
* - 返回值:非空指针表示当前显示图片,nullptr表示未设置图片
* - 调用示例:
* const QPixmap* currentPix = ui->label->pixmap();
* if (currentPix) {
* qDebug() << "当前图片尺寸:" << currentPix->size();
* }
*
* 2. void setPixmap(const QPixmap &pixmap)
* - 功能:设置QLabel要显示的图片内容
* - 参数:pixmap - 待显示的QPixmap对象,空对象(QPixmap())表示清空图片
* - 生效规则:调用后立即生效,图片初始按原始尺寸显示(是否拉伸由scaledContents控制)
* - 调用示例:
* // 从qrc资源加载图片
* ui->label->setPixmap(QPixmap(":/images/logo.png"));
* // 从本地文件加载图片并缩放(先缩放图片,再设置)
* ui->label->setPixmap(QPixmap("D:/test.jpg").scaled(100, 100, Qt::KeepAspectRatio));
* // 清空图片,恢复文本显示
* ui->label->setPixmap(QPixmap());
*
* 【关键注意事项】
* 1. 内容互斥:设置pixmap后,text属性的文本会被完全覆盖,需清空pixmap才能重新显示文本;
* 2. 尺寸显示:图片初始按原始像素尺寸显示,超出QLabel控件范围的部分会被裁剪(除非开启scaledContents);
* 3. 资源路径:使用qrc资源时,路径需以":"开头(如":/images/xxx.png"),本地文件需填写完整路径或相对路径。
*
* ---
*
* @property QLabel::scaledContents
* @brief QLabel的内容拉伸适配属性
* @details 该属性用于控制QLabel内的内容(图片/文本)是否自动拉伸以填充整个QLabel控件区域,默认值为false;
* 核心作用是解决"内容尺寸与控件尺寸不匹配"的显示问题,仅影响内容的展示形态,不改变内容的原始数据。
*
* 【取值说明(通俗版)】
* | 取值 | 功能效果 | 适用场景 |
* |-------|--------------------------------------------------------------------------|------------------------------|
* | true | 内容自动拉伸/收缩至QLabel的宽高,完全填充控件区域;<br>⚠️ 图片可能因宽高比不一致导致变形 | 需要内容填满控件的场景(如背景图) |
* | false | 内容保持原始尺寸,不拉伸;<br>若内容尺寸大于控件,超出部分被裁剪;<br>若内容尺寸小于控件,内容居中显示(对齐方式由alignment控制) | 需要保持图片原始比例/尺寸的场景 |
*
* 【关联API详解】
* 1. bool hasScaledContents() const
* - 功能:获取QLabel是否开启内容自动拉伸
* - 返回值:true表示开启拉伸,false表示关闭(默认)
* - 调用示例:
* bool isScaled = ui->label->hasScaledContents();
*
* 2. void setScaledContents(bool enable)
* - 功能:开启/关闭QLabel的内容自动拉伸功能
* - 参数:enable - true开启拉伸,false关闭拉伸
* - 生效规则:设置后立即生效,已显示的内容会重新适配控件尺寸
* - 调用示例:
* ui->label->setScaledContents(true); // 开启图片拉伸填充
*
* 【关键注意事项】
* 1. 拉伸变形问题:开启true后,图片会强制适配控件宽高,若控件宽高比与图片原始比例不一致,图片会变形;
* ✅ 解决方案:若需保持图片比例,先对QPixmap调用scaled()方法(指定Qt::KeepAspectRatio),再设置到QLabel;
* 2. 文本适配:该属性对文本仅影响行高/字间距的适配,不会改变字体大小,文本拉伸效果不明显;
* 3. 优先级:scaledContents仅控制"内容是否适配控件",若先对QPixmap手动缩放,设置后仍会按scaledContents规则二次适配。
*
* 【典型使用示例】
* ===================================== 示例1:拉伸图片填充控件 =====================================
* ui->label->setFixedSize(200, 200); // 固定控件尺寸
* ui->label->setPixmap(QPixmap(":/images/pic.jpg"));
* ui->label->setScaledContents(true); // 图片拉伸至200x200(可能变形)
*
* ===================================== 示例2:保持图片比例显示 =====================================
* ui->label->setFixedSize(200, 200);
* QPixmap pix(":/images/pic.jpg");
* // 先缩放图片(保持比例),再设置到QLabel
* pix = pix.scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
* ui->label->setPixmap(pix);
* ui->label->setScaledContents(false); // 关闭拉伸,显示缩放后的图片(无变形)
*/
//接下来我们来学习一下QPixmap类:
/**
* @class QPixmap
* @brief Qt中用于处理位图的核心渲染类
* @details QPixmap是Qt提供的专门用于**屏幕显示优化**的位图处理类,核心作用是加载、存储、操作位图图像,并高效渲染到屏幕(如QLabel、QPushButton等控件);
* 该类针对屏幕显示做了深度优化(如利用系统绘图缓存),是Qt界面中展示图片的首选类,区别于QImage(侧重像素级操作)、QPicture(侧重矢量绘图);
* QPixmap支持常见图片格式(JPG/PNG/BMP/GIF等),可与QImage、QByteArray等格式相互转换,是Qt图形处理的基础类之一。
*
* 【核心特性(通俗版)】
* 1. 屏幕渲染优化:QPixmap的内存布局适配系统显卡缓存,绘制到界面时效率远高于QImage,适合"展示图片"场景;
* 2. 只读像素(默认):直接修改QPixmap的像素需先转换为QImage,QPixmap本身更适合"展示"而非"像素编辑";
* 3. 跨平台兼容:自动适配不同系统的显示特性,无需关注底层渲染差异;
* 4. 资源管理:Qt自动管理QPixmap的内存,父对象销毁时会自动释放,也可手动调用detach()分离内存。
*
* 【与QImage的核心区别(必知)】
* | 特性 | QPixmap | QImage |
* |---------------------|----------------------------------|---------------------------------|
* | 核心用途 | 屏幕显示(渲染优化)| 像素级编辑(修改RGB/Alpha通道) |
* | 内存布局 | 适配显卡缓存(平台相关)| 统一内存布局(平台无关)|
* | 像素访问 | 需转换为QImage才能高效访问 | 可直接读写每个像素 |
* | 绘制效率 | 绘制到界面快 | 绘制到界面慢(需转换为QPixmap) |
* | 适用场景 | 展示图片、控件背景、界面渲染 | 图片编辑、像素处理、格式转换 |
*
* 【核心构造函数(创建QPixmap对象)】
* QPixmap提供多种构造方式,适配不同创建场景:
*
* ===================================== 1. 空构造 =====================================
* QPixmap()
* • 功能:创建空的QPixmap对象(无图片数据,尺寸为0x0)
* • 示例:
* QPixmap pix; // 空图片,可后续通过load()加载图片
*
* ===================================== 2. 文件路径构造 =====================================
* QPixmap(const QString &fileName, const char *format = nullptr, Qt::ImageConversionFlags flags = Qt::AutoColor)
* • 功能:直接从本地文件/Qt资源加载图片创建QPixmap
* • 参数说明:
* - fileName:图片路径(本地路径如"D:/test.png",Qt资源路径如":/images/logo.png");
* - format:指定图片格式(如"png"、"jpg",默认nullptr自动识别);
* - flags:颜色转换标志(默认Qt::AutoColor即可);
* • 示例:
* QPixmap pix(":/images/avatar.png"); // 从Qt资源加载PNG图片
* QPixmap pix2("D:/photo.jpg"); // 从本地文件加载JPG图片
*
* ===================================== 3. 尺寸构造 =====================================
* QPixmap(int width, int height)
* QPixmap(const QSize &size)
* • 功能:创建指定尺寸的空白QPixmap(像素初始为透明/白色,可用于绘图)
* • 参数:width/height为图片宽高(单位:像素),size为尺寸对象;
* • 示例:
* QPixmap pix(200, 200); // 创建200x200的空白图片
* pix.fill(Qt::red); // 填充为红色
*
* ===================================== 4. 从QImage转换构造 =====================================
* QPixmap(const QImage &image, Qt::ImageConversionFlags flags = Qt::AutoColor)
* • 功能:将QImage(像素编辑后的图片)转换为QPixmap,用于界面显示
* • 示例:
* QImage img("D:/edit.png");
* img.setPixel(10, 10, qRgb(255,0,0)); // 编辑像素
* QPixmap pix(img); // 转换为QPixmap用于显示
*
* 【核心成员函数(常用操作)】
* QPixmap的API按功能可分为"加载/保存""尺寸操作""缩放/裁剪""格式转换"四大类,以下为高频使用的函数:
*
* ===================================== 1. 加载/保存 =====================================
* 1.1 bool load(const QString &fileName, const char *format = nullptr, Qt::ImageConversionFlags flags = Qt::AutoColor)
* • 功能:动态加载图片文件(构造后加载,适合按需加载场景)
* • 返回值:bool类型,true加载成功,false加载失败(路径错误/格式不支持);
* • 示例:
* QPixmap pix;
* if (pix.load(":/images/test.png")) {
* qDebug() << "图片加载成功";
* } else {
* qDebug() << "图片加载失败";
* }
*
* 1.2 bool save(const QString &fileName, const char *format = nullptr, int quality = -1)
* • 功能:将QPixmap保存为文件
* • 参数:
* - fileName:保存路径(如"D:/save.jpg");
* - format:保存格式("png"/"jpg"/"bmp",默认自动识别);
* - quality:质量(仅JPG有效,0-100,-1使用默认质量);
* • 示例:
* QPixmap pix(":/images/avatar.png");
* pix.save("D:/avatar_copy.jpg", "jpg", 90); // 保存为JPG,质量90%
*
* ===================================== 2. 尺寸操作 =====================================
* 2.1 QSize size() const / int width() const / int height() const
* • 功能:获取QPixmap的尺寸/宽度/高度(单位:像素);
* • 示例:
* QPixmap pix(":/images/logo.png");
* qDebug() << "图片尺寸:" << pix.size() << "宽:" << pix.width() << "高:" << pix.height();
*
* 2.2 void resize(int width, int height) / void resize(const QSize &size)
* • 功能:调整QPixmap的尺寸(直接拉伸,可能变形,推荐用scaled());
* • 注意:优先使用scaled()(支持比例/平滑缩放),resize仅用于简单调整。
*
* ===================================== 3. 缩放/裁剪(最常用) =====================================
* 3.1 QPixmap scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const
* 3.2 QPixmap scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const
* • 功能:返回缩放后的新QPixmap(原对象不变),核心缩放接口;
* • 参数详解(通俗版):
* - size/width/height:目标尺寸;
* - aspectRatioMode:比例模式:
* ✅ Qt::IgnoreAspectRatio:忽略比例,强制拉伸至目标尺寸(易变形);
* ✅ Qt::KeepAspectRatio:保持宽高比,缩放后图片完全包含在目标尺寸内(无变形);
* ✅ Qt::KeepAspectRatioByExpanding:保持宽高比,缩放后图片完全覆盖目标尺寸(需裁剪);
* - transformMode:变换模式:
* ✅ Qt::FastTransformation:快速缩放(效率高,低分辨率图片可能模糊);
* ✅ Qt::SmoothTransformation:平滑缩放(效率稍低,图片更清晰,推荐用于高清图);
* • 示例:
* QPixmap pix(":/images/big_pic.png");
* // 保持比例缩放到200x200,平滑缩放(无变形)
* QPixmap scaledPix = pix.scaled(200, 200, Qt::KeepAspectRatio, Qt::SmoothTransformation);
*
* 3.3 QPixmap copy(const QRect &rect) const
* • 功能:裁剪QPixmap,返回指定区域的新QPixmap(原对象不变);
* • 参数:rect - 裁剪区域(x,y为左上角坐标,width/height为裁剪尺寸);
* • 示例:
* QPixmap pix(":/images/full.png");
* // 裁剪左上角100x100的区域
* QPixmap croppedPix = pix.copy(QRect(0, 0, 100, 100));
*
* ===================================== 4. 格式转换 =====================================
* 4.1 QImage toImage() const
* • 功能:将QPixmap转换为QImage,用于像素级编辑;
* • 示例:
* QPixmap pix(":/images/edit.png");
* QImage img = pix.toImage();
* img.setPixel(50, 50, qRgb(0,255,0)); // 修改像素为绿色
* pix = QPixmap::fromImage(img); // 转换回QPixmap用于显示
*
* 4.2 static QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags = Qt::AutoColor)
* • 功能:静态函数,将QImage转换为QPixmap(与构造函数效果一致);
*
* ===================================== 5. 其他常用操作 =====================================
* 5.1 void fill(const QColor &color = Qt::white)
* • 功能:用指定颜色填充整个QPixmap(清空图片内容);
* • 示例:
* QPixmap pix(200, 200);
* pix.fill(Qt::transparent); // 填充为透明色
*
* 5.2 bool isNull() const
* • 功能:判断QPixmap是否为空(无图片数据);
* • 示例:
* QPixmap pix;
* if (pix.isNull()) {
* qDebug() << "QPixmap为空";
* }
*
* 【典型使用示例】
* ===================================== 示例1:加载并缩放图片显示到QLabel =====================================
* // 1. 加载图片
* QPixmap pix(":/images/background.png");
* if (pix.isNull()) {
* qDebug() << "图片加载失败";
* return;
* }
* // 2. 保持比例缩放到QLabel尺寸,平滑缩放
* QLabel* imgLabel = new QLabel(this);
* imgLabel->setFixedSize(300, 200);
* QPixmap scaledPix = pix.scaled(imgLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
* // 3. 设置到QLabel并显示
* imgLabel->setPixmap(scaledPix);
* imgLabel->setScaledContents(false); // 关闭拉伸,保持缩放后比例
*
* ===================================== 示例2:QImage编辑后转换为QPixmap =====================================
* // 1. 加载图片为QImage(方便编辑)
* QImage img("D:/test.png");
* // 2. 像素级修改(将(10,10)像素改为红色)
* if (!img.isNull()) {
* img.setPixel(10, 10, qRgb(255, 0, 0));
* }
* // 3. 转换为QPixmap显示到界面
* QPixmap pix = QPixmap::fromImage(img);
* ui->label->setPixmap(pix);
*
* ===================================== 示例3:保存QPixmap到本地 =====================================
* QPixmap pix(":/images/avatar.png");
* // 保存为PNG格式(无损)
* bool saveOk = pix.save("D:/avatar_save.png");
* if (saveOk) {
* qDebug() << "保存成功";
* } else {
* qDebug() << "保存失败(路径无权限/格式不支持)";
* }
*
* 【关键注意事项】
* 1. 路径问题:
* - 加载Qt资源文件时路径以":"开头(如":/images/xxx.png"),需确保.qrc文件已添加到项目;
* - 加载本地文件时建议使用绝对路径,避免相对路径导致的加载失败;
* 2. 缩放优化:
* - 显示高清图片时,务必使用Qt::SmoothTransformation,否则缩放后会模糊;
* - 保持比例缩放优先用Qt::KeepAspectRatio,避免图片变形;
* 3. 内存管理:
* - 大尺寸QPixmap(如4K图片)会占用较多内存,使用后可调用clear()释放;
* - QPixmap在多线程中仅能在主线程创建/渲染,子线程处理图片需用QImage;
* 4. 格式支持:
* - QPixmap支持的格式依赖系统插件,默认支持JPG/PNG/BMP,GIF仅支持静态帧(动态GIF需用QMovie);
* 5. 透明通道:
* - PNG格式支持透明,JPG不支持,保存透明图片需选择PNG格式。
*/
//创建QLbael对象
//为了下面的重写事件可以用到该变量,我们需要把该变量设置为类的成员变量哦
//QLabel* label=new QLabel(this);
label=new QLabel(this);
label->move(0,100);
//创建QPixmap对象,同样使用qrc机制~~
//算了,有点麻烦,我们还是直接来个绝对路径~
QPixmap pixmap("C:/Users/Win/Desktop/b_17576d8be766c15b868aa7e1da548e34.jpg");
//设置QLabel对象的pixmap属性
label->setPixmap(pixmap);
//我们再设置该对象支持自动拉伸填充
//首先设置该QLabel对象的大小和QWidget窗口的大小一样~
label->setGeometry(0,0,this->geometry().width(),this->geometry().height());
//由于图片本身比窗口小,所以如果我们没有设置该QLabel的ScaledContents为true的话,那么图片无法填满整个窗口
//但是当我们设置了为true之后,就可以填满整个窗口了~~~
label->setScaledContents(true);
//还是比较简单的,但是却无法支持能够随着我们拉伸窗口大小而自动填充整个窗口
//那么要是我们想能够随着我们拉伸窗口大小而自动填充整个窗口,就得重写窗口的resizeEvent事件啦~~~
//下面我们就来重写一下,重写设置该事件发生的同时会同时将QLabel对象进行拉伸~
}
// 重写 resizeEvent. 这个1 函数会在窗口大小发生改变时被自动调用.
//注意我们要重写函数,也是需要在头文件中进行声明的哦
void Widget::resizeEvent(QResizeEvent *event)
{
// 可以直接通过 this->width() 和 this->height() 设置 label 新的尺寸, 也可以通过event 参数拿到新的尺寸.
// this->label->setGeometry(0, 0, this->width(), this->height());
this->label->setGeometry(0, 0, event->size().width(), event->size().height());
qDebug() << event->size();
}
//还是比较简单的
Widget::~Widget()
{
delete ui;
}
3.3.4 进阶内容:重写 resizeEvent 让图片随窗口大小变化
这里有一个常见的需求:让 QLabel 中的图片随窗口大小变化而自动变化 。单纯用 scaledContents 是做不到的 ------ 因为 scaledContents 只是让图片填充初始的 QLabel 尺寸,窗口大小变化时,QLabel 尺寸变化了,但图片不会自动重新缩放。
要实现这个需求,我们需要重写 QWidget 的 resizeEvent 事件------ 这个事件会在窗口大小发生改变时被 Qt 自动调用,我们可以在这个事件中重新设置 QLabel 的尺寸,并重新缩放图片。
这里涉及到 C++ 的多态机制,我简单解释一下:Qt 框架内部管理着 QWidget 对象表示我们的窗口,在窗口大小发生改变时,Qt 会自动调用 resizeEvent 函数。但实际上表示窗口的并非 QWidget,而是 QWidget 的子类(也就是我们自己写的 Widget 类)。此时虽然是通过父类调用函数,但实际上执行的是子类的函数(也就是我们重写后的 resizeEvent)。这就是多态机制的一种经典用法 ------ 通过重写事件函数,把自定义的代码插入到框架内部执行,相当于 "注册回调函数"。
下面是完整的代码示例:
代码示例:重写 resizeEvent 让图片随窗口大小变化
首先,我们需要在头文件(widget.h)中声明重写的 resizeEvent 函数:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 声明重写的 resizeEvent 函数
protected:
void resizeEvent(QResizeEvent *event) override;
private:
Ui::Widget *ui;
QLabel *imageLabel; // 把 QLabel 定义为成员变量,方便在 resizeEvent 中访问
QPixmap originalPixmap; // 存储原始图片,方便重新缩放
};
#endif // WIDGET_H
然后,在源文件(widget.cpp)中实现 resizeEvent 函数:
#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QResizeEvent>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1. 创建 QLabel 并设置为成员变量
imageLabel = new QLabel(this);
imageLabel->setGeometry(0, 0, this->width(), this->height()); // 初始大小和窗口一样大
imageLabel->setScaledContents(false); // 关闭自动拉伸,我们手动缩放
imageLabel->setStyleSheet("QLabel { background-color: #f0f0f0; }");
// 2. 加载原始图片并存储为成员变量
originalPixmap.load(":/images/photo.jpg");
if (originalPixmap.isNull()) {
qDebug() << "图片加载失败";
return;
}
// 3. 初始缩放图片并显示
QPixmap scaledPix = originalPixmap.scaled(imageLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
imageLabel->setPixmap(scaledPix);
}
// 重写 resizeEvent 函数:窗口大小变化时自动调用
void Widget::resizeEvent(QResizeEvent *event)
{
// 调用父类的 resizeEvent(必须调用,否则父类的事件处理会失效)
QWidget::resizeEvent(event);
// 1. 重新设置 QLabel 的大小为新的窗口大小
// 可以通过 this->width() 和 this->height() 获取新尺寸,也可以通过 event->size() 获取
imageLabel->setGeometry(0, 0, event->size().width(), event->size().height());
// 2. 重新缩放原始图片,适配新的 QLabel 尺寸
if (!originalPixmap.isNull()) {
QPixmap scaledPix = originalPixmap.scaled(imageLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
imageLabel->setPixmap(scaledPix);
}
// 3. 打印新尺寸,方便调试
qDebug() << "窗口大小变化,新尺寸:" << event->size();
}
Widget::~Widget()
{
delete ui;
}
这样,当你拖动窗口边缘改变窗口大小时,QLabel 中的图片会自动重新缩放,保持比例填充窗口,非常实用!
第四章 QLabel 文本布局与样式核心属性详解(alignment、wordWrap、indent、margin)
讲完了文本和图片展示,我们再讲 QLabel 的文本布局与样式核心属性 ------alignment(对齐方式)、wordWrap(自动换行)、indent(文本缩进)、margin(内边距)。这四个属性是用来控制文本在 QLabel 中的位置、换行、间距的,能让文本展示效果更美观、更易读。
4.1 属性五:alignment(对齐方式)------ 控制内容位置的核心
alignment 属性是 QLabel 中最常用的布局属性之一,用于控制 QLabel 内部内容(文本 / 图片)的水平 + 垂直对齐方向,是调整内容显示位置的核心属性。
4.1.1 属性的核心定义
alignment 属性用于控制 QLabel 内部内容(文本 / 图片)的水平 + 垂直对齐方向,支持水平、垂直方向的枚举值组合使用,默认值为 Qt::AlignLeft | Qt::AlignVCenter(左对齐 + 垂直居中)。
通俗理解:alignment 就像 "告示牌上内容的位置"------ 你可以让内容在左上角、右上角、左下角、右下角、正中间,等等。
这里有一个非常重要的点:对齐方式分为水平、垂直两类,必须同时指定(若仅指定一个,另一个用默认值)------ 比如只指定水平居中,垂直方向会用默认的垂直居中;只指定垂直底部对齐,水平方向会用默认的左对齐。
4.1.2 数据类型
Qt::Alignment 枚举组合类型,这是 Qt 中专门用来定义对齐方式的枚举,支持通过 | 运算符组合水平和垂直方向的枚举值。
4.1.3 对齐枚举值详解(通俗版,一目了然)
为了让你更清楚地理解每个枚举值的作用,我做了一个分类表格:
| 方向分类 | 枚举值 | 功能说明 | 通俗描述 | |
|---|---|---|---|---|
| 水平方向 | Qt::AlignLeft | 内容左对齐(默认水平方向) | 内容靠左边 | |
| Qt::AlignRight | 内容右对齐 | 内容靠右边 | ||
| Qt::AlignHCenter | 内容水平居中(最常用) | 内容在水平方向中间 | ||
| Qt::AlignJustify | 内容两端对齐(仅文本生效) | 文本左右两端都对齐,调整字间距 | ||
| 垂直方向 | Qt::AlignTop | 内容顶部对齐 | 内容靠上边 | |
| Qt::AlignBottom | 内容底部对齐 | 内容靠下边 | ||
| Qt::AlignVCenter | 内容垂直居中(默认垂直方向) | 内容在垂直方向中间 | ||
| Qt::AlignBaseline | 文本基线对齐(仅文本生效) | 文本的基线对齐(较少用) | ||
| 组合值 | Qt::AlignCenter | 水平 + 垂直居中(最常用组合) | 内容在正中间 | |
| Qt::AlignRight | Qt::AlignBottom | 右下对齐 | 内容在右下角 | |
| Qt::AlignLeft | Qt::AlignTop | 左上对齐 | 内容在左上角 |
4.1.4 关联 API 详解
1. 获取当前对齐方式:Qt::Alignment alignment () const
函数原型:
Qt::Alignment QLabel::alignment() const;
逐词逐句底层解析:
Qt::Alignment:返回值类型,返回当前的对齐方式枚举组合;QLabel:::成员函数;alignment():函数名,"获取对齐方式" 的意思;const:常成员函数。
返回值说明:
- 返回
Qt::Alignment枚举组合值,默认返回Qt::AlignLeft | Qt::AlignVCenter。
调用示例:
Qt::Alignment currentAlign = ui->label->alignment();
qDebug() << "当前对齐方式(枚举值):" << currentAlign;
2. 设置对齐方式:void setAlignment (Qt::Alignment align)
函数原型:
void QLabel::setAlignment(Qt::Alignment align);
逐词逐句底层解析:
void:无返回值;QLabel:::成员函数;setAlignment():函数名,"设置对齐方式" 的意思;Qt::Alignment align:入参,align是对齐方式枚举组合(支持水平 + 垂直组合)。
参数说明:
align:对齐方式枚举组合,常用Qt::AlignCenter(正中间)、Qt::AlignLeft | Qt::AlignTop(左上);- 注意:如果只指定一个方向的枚举值,另一个方向会用默认值 ------ 比如只写
Qt::AlignHCenter,垂直方向会用默认的Qt::AlignVCenter,相当于Qt::AlignCenter。
生效规则:
- 调用后立即生效,内容会重新按指定方向对齐;
- 如果开启了
scaledContents=true(内容拉伸填充),对齐方式会失效,内容会填满整个控件。
调用示例:
// 示例1:设置为正中间(最常用)
ui->label->setAlignment(Qt::AlignCenter);
ui->label->setText("正中间的文本");
// 示例2:设置为右下对齐
ui->label->setAlignment(Qt::AlignRight | Qt::AlignBottom);
ui->label->setText("右下角的文本");
// 示例3:设置为左上对齐
ui->label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
ui->label->setText("左上角的文本");
4.2 属性六:wordWrap(自动换行)------ 适配长文本的核心
wordWrap 属性是用来控制 QLabel 内的文本是否自动换行的,仅对文本生效(图片无换行逻辑),是适配长文本显示的核心属性。
4.2.1 属性的核心定义
wordWrap 属性用于控制 QLabel 内的文本内容是否自动换行,仅对文本生效,默认值为 false。
通俗理解:wordWrap 就像 "告示牌的文本换行功能"------ 如果开启(true),文本太长超出告示牌宽度时,会自动折到下一行;如果关闭(false),文本太长会被裁剪掉,只显示单行。
这里有两个非常重要的点需要注意:
- 生效前提 :仅当 QLabel 宽度固定时(如
setFixedWidth()、布局限制宽度),换行才会生效;如果 QLabel 宽度自适应(比如在布局中没有设置固定宽度),文本会一直向右延伸,不会换行; - 富文本换行优先级 :富文本中的
<br>标签优先级高于wordWrap------ 即使关闭wordWrap,<br>仍会强制换行。
4.2.2 数据类型
bool 类型,true 表示开启自动换行,false 表示关闭(默认)。
4.2.3 关联 API 详解(逐词逐句,零模糊)
1. 获取是否开启换行:bool wordWrap () const
函数原型:
bool QLabel::wordWrap() const;
逐词逐句底层解析:
bool:返回值类型,返回是否开启自动换行;QLabel:::成员函数;wordWrap():函数名,"获取是否自动换行" 的意思;const:常成员函数。
返回值说明:
true表示开启自动换行,false表示关闭(默认)。
调用示例:
bool isWrap = ui->label->wordWrap();
qDebug() << "是否开启自动换行:" << isWrap;
2. 设置是否开启换行:void setWordWrap (bool on)
函数原型:
void QLabel::setWordWrap(bool on);
逐词逐句底层解析:
void:无返回值;QLabel:::成员函数;setWordWrap():函数名,"设置自动换行" 的意思;bool on:入参,on是true开启换行,false关闭换行。
参数说明:
on:true开启自动换行,false关闭换行;- 注意:开启换行后,必须固定 QLabel 的宽度,否则换行不会生效。
生效规则:
- 调用后立即生效,文本会重新按宽度换行;
- 换行规则:按单词 / 字符拆分,不截断完整词汇(中文按字符拆分,英文按单词拆分)。
调用示例:
// 示例:开启自动换行,适配长文本
// 1. 先固定 QLabel 的宽度(换行的前提)
ui->label->setFixedWidth(200);
// 2. 开启自动换行
ui->label->setWordWrap(true);
// 3. 设置长文本
ui->label->setText("这是一段很长的文本,超出 200 像素宽度后会自动换行显示,不会被裁剪掉。");
// 4. 可以配合对齐方式,让文本更美观
ui->label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
4.3 属性七:indent(文本缩进)与属性八:margin(内边距)------ 控制文本间距的两个属性
最后,我们讲两个控制文本间距的属性:indent(文本缩进)和 margin(内边距)。这两个属性看起来有点像,都是控制间距的,但实际上有很大的区别,我们放在一起对比讲解,方便你理解。
4.3.1 两个属性的核心定义对比
为了让你更清楚地理解它们的区别,我先做一个核心对比表格:
| 特性 | indent(文本缩进) | margin(内边距) |
|---|---|---|
| 核心作用 | 设置文本内容的缩进距离(仅文本生效) | 设置内部内容(文本 / 图片)与边框的内边距(文本 / 图片均生效) |
| 生效方向 | 最多 2 个方向(随对齐方式变化) | 上下左右 4 个方向同时生效 |
| 居中对齐时 | 完全失效(indent 无效) | 仍生效(内容与边框留空白) |
| 作用对象 | 仅文本 | 文本 / 图片均生效 |
| 默认值 | 0(无缩进) | 0(无内边距) |
| 常用程度 | 较低(比较鸡肋) | 较高(常用) |
通俗理解:
- indent:就像 "写作文时的段落首行缩进"------ 但它比较特殊,缩进方向由对齐方式决定,而且居中对齐时无效,最多只有两个方向有缩进,所以比较鸡肋,实际开发中用得不多;
- margin:就像 "画框与画之间的留白"------ 上下左右四个方向同时留白,无论内容是否居中,都有效,而且对文本和图片都生效,实际开发中用得更多。
4.3.2 indent(文本缩进)详解
1. 数据类型
int 类型,单位是像素,默认值为 0(无缩进)。
2. 缩进规则(与 alignment 强关联,必知)
indent 的缩进方向完全由 alignment(对齐方式)决定,规则如下:
| alignment 对齐方式 | indent 生效方向 | 效果示例 |
|---|---|---|
| Qt::AlignLeft(左对齐) | 水平向左缩进(文本向右移) | indent=20 → 文本左侧空 20 像素 |
| Qt::AlignRight(右对齐) | 水平向右缩进(文本向左移) | indent=20 → 文本右侧空 20 像素 |
| Qt::AlignTop(上对齐) | 垂直向上缩进(文本向下移) | indent=20 → 文本顶部空 20 像素 |
| Qt::AlignBottom(下对齐) | 垂直向下缩进(文本向上移) | indent=20 → 文本底部空 20 像素 |
| 居中对齐(HCenter/VCenter) | 无效果(indent 完全失效) | - |
3. 关联 API 详解
// 获取缩进值
int indent() const;
// 设置缩进值(负数无效果,自动修正为 0)
void setIndent(int indent);
4. 调用示例
// 示例:设置文本左侧缩进(必须左对齐,indent 才生效)
ui->label->setAlignment(Qt::AlignLeft | Qt::AlignTop); // 左对齐+上对齐
ui->label->setIndent(20); // 文本左侧缩进 20 像素
ui->label->setWordWrap(true); // 开启自动换行
ui->label->setText("这是一段带左侧缩进的长文本,左对齐时 indent 生效,居中对齐时无效。");
4.3.3 margin(内边距)详解
1. 数据类型
int 类型,单位是像素,默认值为 0(无内边距)。
2. 生效规则
- 上下左右四个方向同时生效,内容与 QLabel 边框的四个方向都保留指定的像素空白;
- 无论对齐方式如何(包括居中对齐),都有效;
- 对文本和图片都生效。
3. 关联 API 详解
// 获取内边距值
int margin() const;
// 设置内边距值(负数无效果,自动修正为 0)
void setMargin(int margin);
⚠️ 注意 :QLabel 的 setMargin(int) 是一个旧接口,实际上它是设置四个方向相同的内边距。在 Qt 中,更推荐使用 setContentsMargins(int left, int top, int right, int bottom)(继承自 QWidget),可以分别设置上下左右四个方向的内边距,更灵活。
4. 调用示例
// 示例1:使用 QLabel 的 setMargin 设置四方向相同的内边距
ui->label->setMargin(10); // 上下左右均保留 10 像素空白
ui->label->setAlignment(Qt::AlignCenter); // 居中对齐,margin 仍生效
ui->label->setText("居中显示,四方向内边距 10 像素");
// 示例2:使用 QWidget 的 setContentsMargins 设置不同方向的内边距(更灵活,推荐)
// 参数:left, top, right, bottom(左、上、右、下)
ui->label->setContentsMargins(20, 10, 20, 10); // 左右 20,上下 10
ui->label->setWordWrap(true);
ui->label->setText("左右内边距 20,上下内边距 10,长文本自动换行。");
四属性示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK,那么本文件我们来学习QLabel的alignment属性、wordWrap属性、indent属性、margin属性~~~
//这几个属性其实都是和文本有关的,alignment 属性是设置QLabel中的文本的水平和垂直方向是要如何对齐,居中还是居左还是居右,这个我们都不陌生~
//就是设置文本的位置呗,很简单
//而wordWrap属性则是设置QLabel内部的文本会不会自动换行,即达到边界了,就进行换行
//设为 true 内部的文本会自动换行,设为 false 则内部文本不会自动换行.
//然后是indent属性,这个属性则是设置文本缩进,就是设置QLabel中的文本会不会缩进,就像我们写作文每一个段开头往后缩两格
//但是需要注意的是,这个属性其实比较鸡肋,一旦设置为true之后,那么文本的水平和垂直方向都会缩进,而且是每一行都缩进
//所以没有用途就是了~
//最后是margin属性,这个属性也是比较鸡肋一些,就是设置内部文本和边框之间的边距,不同于 indent, 它是上下左右四个方向都同时有效.
//而 indent 最多只是两个方向有效(具体哪两个方向有效取决于 alignment )
//而上面这些我们都能通过qss设置,所以也就不怎么重要了~
/**
* @property QLabel::alignment
* @brief QLabel的内容对齐方式属性
* @details 该属性用于控制QLabel内部内容(文本/图片)的水平+垂直对齐方向,是调整内容显示位置的核心属性;
* 支持水平、垂直方向的枚举值组合使用,默认值为Qt::AlignLeft | Qt::AlignVCenter(左对齐+垂直居中)。
*
* 【对齐枚举值详解(Qt::Alignment)】
* 对齐方式分为水平、垂直两类,可通过"|"运算符组合(如水平居中+垂直底部对齐),常用枚举值如下:
* | 方向分类 | 枚举值 | 功能说明 |
* |----------|-------------------------|------------------------------|
* | 水平方向 | Qt::AlignLeft | 内容左对齐(默认)|
* | | Qt::AlignRight | 内容右对齐 |
* | | Qt::AlignHCenter | 内容水平居中(最常用)|
* | | Qt::AlignJustify | 内容两端对齐(仅文本生效)|
* | 垂直方向 | Qt::AlignTop | 内容顶部对齐 |
* | | Qt::AlignBottom | 内容底部对齐 |
* | | Qt::AlignVCenter | 内容垂直居中(默认)|
* | | Qt::AlignBaseline | 文本基线对齐(仅文本生效)|
*
* 【关联API详解】
* 1. Qt::Alignment alignment() const
* - 功能:获取当前的对齐方式
* - 返回值:Qt::Alignment枚举组合值
* - 调用示例:
* Qt::Alignment align = ui->label->alignment();
*
* 2. void setAlignment(Qt::Alignment align)
* - 功能:设置内容的对齐方式
* - 参数:align - 对齐枚举值组合(支持水平+垂直组合)
* - 生效规则:设置后立即生效,内容会重新按指定方向对齐
* - 示例:
* ui->label->setAlignment(Qt::AlignCenter); // 水平+垂直居中(最常用)
* ui->label->setAlignment(Qt::AlignRight | Qt::AlignBottom); // 右下对齐
* ui->label->setAlignment(Qt::AlignHCenter | Qt::AlignTop); // 顶部居中
*
* 【关键注意事项】
* 1. 组合使用:必须同时指定水平+垂直方向(若仅指定一个,另一个用默认值);
* 2. 图片适配:对齐方式对图片同样生效(如右对齐会将图片固定在QLabel右侧);
* 3. 文本换行:wordWrap开启后,对齐方式仍作用于每一行文本。
*
* ---
*
* @property QLabel::wordWrap
* @brief QLabel的文本自动换行属性
* @details 该属性用于控制QLabel内的文本内容是否自动换行,仅对文本生效(图片无换行逻辑),默认值为false;
* 核心作用是适配长文本显示,避免文本超出QLabel宽度被裁剪。
*
* 【取值说明(通俗版)】
* | 取值 | 功能效果 |
* |-------|--------------------------------------------------------------------------|
* | true | 文本超出QLabel宽度时自动换行,适配长文本显示;<br>换行规则:按单词/字符拆分,不截断完整词汇 |
* | false | 文本不自动换行,超出QLabel宽度的部分直接被裁剪(无省略号),仅显示单行 |
*
* 【关联API详解】
* 1. bool wordWrap() const
* - 功能:获取是否开启自动换行
* - 返回值:true开启,false关闭(默认)
*
* 2. void setWordWrap(bool on)
* - 功能:开启/关闭文本自动换行
* - 参数:on - true开启,false关闭
* - 示例:
* ui->label->setFixedWidth(200); // 固定QLabel宽度(换行的前提)
* ui->label->setWordWrap(true); // 开启自动换行
* ui->label->setText("这是一段很长的文本,超出200像素宽度会自动换行显示");
*
* 【关键注意事项】
* 1. 生效前提:仅当QLabel宽度固定时(如setFixedWidth、布局限制宽度),换行才会生效;宽度自适应时无换行效果;
* 2. 优先级:富文本中的<br>标签优先级高于wordWrap,即使关闭wordWrap,<br>仍会强制换行;
* 3. 图片无关:该属性对图片无任何影响。
*
* ---
*
* @property QLabel::indent
* @brief QLabel的文本缩进属性
* @details 该属性用于设置文本内容的缩进距离(单位:像素),仅对文本生效,缩进方向由alignment属性决定,默认值为0;
* 核心作用是调整文本与QLabel边框的间距,最多仅在两个方向生效(水平/垂直)。
*
* 【缩进规则(与alignment强关联)】
* | alignment对齐方式 | indent生效方向 | 效果示例 |
* |-------------------------|-------------------------------|------------------------------|
* | Qt::AlignLeft(左对齐) | 水平向左缩进(文本向右移)| indent=20 → 文本左侧空20像素 |
* | Qt::AlignRight(右对齐)| 水平向右缩进(文本向左移)| indent=20 → 文本右侧空20像素 |
* | Qt::AlignTop(上对齐) | 垂直向上缩进(文本向下移)| indent=20 → 文本顶部空20像素 |
* | Qt::AlignBottom(下对齐)| 垂直向下缩进(文本向上移)| indent=20 → 文本底部空20像素 |
* | 居中对齐(HCenter/VCenter) | 无效果(indent失效)| - |
*
* 【关联API详解】
* 1. int indent() const
* - 功能:获取文本缩进像素值
* - 返回值:缩进值(默认0,负数无效果)
*
* 2. void setIndent(int indent)
* - 功能:设置文本缩进值
* - 参数:indent - 缩进像素值(非负整数,负数会被自动修正为0)
* - 示例:
* ui->label->setAlignment(Qt::AlignLeft); // 左对齐(缩进生效前提)
* ui->label->setIndent(20); // 文本左侧缩进20像素
*
* 【关键注意事项】
* 1. 仅文本生效:该属性对图片无任何影响;
* 2. 居中失效:内容居中对齐时,indent设置任何值都无效;
* 3. 方向依赖:缩进方向完全由对齐方式决定,无法单独指定缩进方向。
*
* ---
*
* @property QLabel::margin
* @brief QLabel的内边距属性
* @details 该属性用于设置QLabel内部内容(文本/图片)与QLabel边框之间的间距(单位:像素),上下左右四个方向同时生效,默认值为0;
* 核心作用是统一调整内容与边框的空白距离,区别于indent(仅文本、定向生效)。
*
* 【关联API详解】
* 1. int margin() const
* - 功能:获取内边距像素值
* - 返回值:内边距值(默认0,负数无效果)
*
* 2. void setMargin(int margin)
* - 功能:设置内边距值
* - 参数:margin - 内边距像素值(非负整数,负数会被自动修正为0)
* - 示例:
* ui->label->setMargin(10); // 内容与边框的上下左右均保留10像素空白
*
* 【indent与margin核心区别(必知)】
* | 特性 | indent(文本缩进)| margin(内边距)|
* |--------------|-------------------------------|-------------------------------|
* | 作用对象 | 仅文本 | 文本/图片均生效 |
* | 生效方向 | 最多2个方向(随对齐方式变化) | 上下左右4个方向同时生效 |
* | 居中对齐时 | 完全失效 | 仍生效(内容与边框留空白)|
* | 核心用途 | 调整文本行的缩进(如段落首行) | 统一调整内容与边框的空白距离 |
*
* 【典型组合示例】
* // 需求:文本居中显示,内边距10像素,首行缩进20像素(左对齐+indent实现)
* ui->label->setText("这是一段带缩进和内边距的文本,居中显示且自动换行");
* ui->label->setFixedWidth(200); // 固定宽度
* ui->label->setWordWrap(true); // 开启自动换行
* ui->label->setMargin(10); // 四方向内边距10像素
* ui->label->setAlignment(Qt::AlignLeft); // 左对齐让indent生效
* ui->label->setIndent(20); // 文本左侧缩进20像素
*/
QLabel *label = new QLabel(this);
// 1. 设置基础内容 (一段长文本用于测试换行)
QString longText = "这是一段很长的测试文本。QLabel 的 indent 属性比较鸡肋,只有在不居中的时候才生效。而 margin 属性则是在上下左右四个方向同时留白。";
label->setText(longText);
// 2. 【重要前提】固定宽度
// wordWrap 只有在宽度受限(固定宽度或布局限制)时才会触发换行
label->setFixedWidth(250);
// 为了看清边框效果,可以加个边框样式 (可选)
label->setStyleSheet("QLabel { border: 1px solid gray; background-color: #f0f0f0; }");
// 3. 设置 alignment (对齐方式)
// 注意:为了让后面的 indent 生效,这里必须设置为 AlignLeft 或 AlignRight
// 如果设置为 AlignCenter,indent 将失效!
label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
// 4. 设置 wordWrap (自动换行)
// 设为 true,文本超出 250px 宽度后会自动折行
label->setWordWrap(true);
// 5. 设置 indent (文本缩进)
// 因为上面设置了 AlignLeft,所以这里会在文本左侧缩进 20 像素
// 如果上面是 AlignCenter,这行代码将没有任何视觉效果
label->setIndent(20);
// 6. 设置 margin (内边距)
// 无论对齐方式如何,文本/图片距离 Label 边框的上下左右都会留出 10 像素
label->setContentsMargins(10, 10, 10, 10);
// 注意:Qt 中通常使用 setContentsMargins(left, top, right, bottom)
// QLabel 也有 setMargin(int) 函数,但它是一个旧接口,实际上就是设置四个方向相同的边距
// 为了代码清晰,这里演示 setContentsMargins,效果等同于 label->setMargin(10);
// 如果你一定要用 setMargin (它是 QLabel 特有的便捷函数):
// label->setMargin(10);
}
Widget::~Widget()
{
delete ui;
}
第五章 QLabel 轻量交互核心属性详解(openExternalLinks、buddy)
最后,我们讲 QLabel 的两个轻量交互核心属性:openExternalLinks(外部链接自动打开)和 buddy(伙伴控件关联)。这两个属性可以让 QLabel 从 "纯展示控件" 变成 "有轻量交互的控件",提升界面操作便捷性。
5.1 属性九:openExternalLinks(外部链接自动打开)------ 实现超链接跳转的核心
openExternalLinks 属性是用来控制 QLabel 中文本内的超链接(<a href='URL'> 形式)是否能直接调用系统默认浏览器打开的,是 QLabel 拓展交互能力的核心属性之一。
5.1.1 属性的核心定义
openExternalLinks 属性用于控制 QLabel 中文本内的超链接(<a href='URL'> 形式)是否能直接调用系统默认浏览器打开,默认值为 false。
通俗理解:openExternalLinks 就像 "告示牌上的链接开关"------ 如果开启(true),点击告示牌上的链接,会自动打开浏览器访问对应网址;如果关闭(false),点击链接只会触发一个信号,需要你自己写代码处理跳转。
这里有三个非常重要的点需要注意:
- 生效前提 :
- 文本必须包含合法的 HTML 超链接标签(
<a href='完整URL'>链接文本</a>); textFormat需为Qt::RichText或Qt::AutoText(PlainText模式下链接标签会被原样显示,无交互);
- 文本必须包含合法的 HTML 超链接标签(
- 链接格式 :URL 必须是完整的(如
https://www.qt.io),仅写域名(如www.qt.io)可能无法正常打开; - 信号兼容 :即使开启
true,点击链接仍会触发linkActivated(QString)信号(可同时监听做额外逻辑)。
5.1.2 数据类型
bool 类型,true 表示允许自动打开外部链接,false 表示不允许(默认)。
5.1.3 关联 API 详解(逐词逐句,零模糊)
1. 获取是否允许打开链接:bool openExternalLinks () const
函数原型:
bool QLabel::openExternalLinks() const;
逐词逐句底层解析:
bool:返回值类型,返回是否允许自动打开外部链接;QLabel:::成员函数;openExternalLinks():函数名,"获取是否允许打开外部链接" 的意思;const:常成员函数。
返回值说明:
true表示允许自动打开,false表示不允许(默认)。
调用示例:
bool canOpen = ui->label->openExternalLinks();
qDebug() << "是否允许自动打开外部链接:" << canOpen;
2. 设置是否允许打开链接:void setOpenExternalLinks (bool open)
函数原型:
void QLabel::setOpenExternalLinks(bool open);
逐词逐句底层解析:
void:无返回值;QLabel:::成员函数;setOpenExternalLinks():函数名,"设置是否允许打开外部链接" 的意思;bool open:入参,open是true允许自动打开,false不允许。
参数说明:
open:true允许自动打开外部链接,false不允许;- 注意:必须配合
Qt::RichText或Qt::AutoText的textFormat使用。
生效规则:
- 调用后立即生效,点击链接会自动调用系统默认浏览器打开;
- 不同系统(Windows/macOS/Linux)打开浏览器的逻辑由 Qt 自动适配,无需额外处理。
调用示例:
// 示例:开启自动打开外部链接
// 1. 设置文本格式为富文本(或 AutoText)
ui->label->setTextFormat(Qt::RichText);
// 2. 设置包含 HTML 超链接的文本
ui->label->setText("点击这里访问 <a href='https://www.qt.io'>Qt 官方网站</a>");
// 3. 开启自动打开外部链接
ui->label->setOpenExternalLinks(true);
// 4. 可以加个样式,让链接看起来更明显
ui->label->setStyleSheet("QLabel { padding: 10px; font-size: 14px; }");
// 效果:点击"Qt 官方网站",自动打开系统默认浏览器访问 https://www.qt.io
5.2 属性十:buddy(伙伴控件关联)------ 实现标签联动交互的核心
最后,我们讲 buddy(伙伴控件关联)属性 ------ 这个属性是用来为 QLabel 绑定一个 "伙伴控件" 的,点击 QLabel 时会自动激活该伙伴控件,实现 "标签联动交互",是提升表单操作便捷性的常用属性。
5.2.1 属性的核心定义
buddy 属性用于为 QLabel 绑定一个 "伙伴控件"(QWidget 子类),点击 QLabel 时会自动激活该伙伴控件,实现 "标签联动交互"。
通俗理解:buddy 就像 "告示牌的开关触发器"------ 点击告示牌,会自动触发旁边的开关。
这里有一个非常重要的点:绑定伙伴后点击 QLabel 的行为,由伙伴控件的类型决定,常见的行为如下:
- 伙伴为 QLineEdit/QTextEdit:自动聚焦到输入框(光标定位到输入框);
- 伙伴为 QCheckBox/QRadioButton:自动切换选中状态(勾选 / 取消勾选、选中 / 取消选中);
- 伙伴为 QPushButton:自动触发按钮点击(等效于点击按钮);
- 伙伴为 QComboBox:自动弹出下拉选项列表。
5.2.2 数据类型
QWidget* 类型,指向绑定的伙伴控件,nullptr 表示未关联任何伙伴。
5.2.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前伙伴:QWidget* buddy () const
函数原型:
QWidget* QLabel::buddy() const;
逐词逐句底层解析:
QWidget*:返回值类型,返回当前关联的伙伴控件指针;QLabel:::成员函数;buddy():函数名,"获取伙伴控件" 的意思;const:常成员函数。
返回值说明:
- 返回
QWidget*类型的指针,nullptr表示未关联任何伙伴。
调用示例:
QWidget* currentBuddy = ui->label->buddy();
if (currentBuddy) {
qDebug() << "当前伙伴控件:" << currentBuddy->objectName();
} else {
qDebug() << "当前未关联伙伴控件";
}
2. 设置伙伴:void setBuddy (QWidget *buddy)
函数原型:
void QLabel::setBuddy(QWidget *buddy);
逐词逐句底层解析:
void:无返回值;QLabel:::成员函数;setBuddy():函数名,"设置伙伴控件" 的意思;QWidget *buddy:入参,buddy是待关联的 QWidget 子类控件指针。
参数说明:
buddy:待关联的 QWidget 子类控件指针(需是当前界面的有效控件);- 传入
nullptr可解除与伙伴控件的关联; - 注意:伙伴控件需与 QLabel 同属一个窗口,跨窗口绑定会失效。
生效规则:
- 调用后立即生效,点击 QLabel 会自动激活伙伴控件;
- 绑定伙伴后,QLabel 的文本 / 图片显示逻辑不受任何影响。
调用示例:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建一个垂直布局,方便放置表单控件
QVBoxLayout *layout = new QVBoxLayout(this);
// 示例1:标签关联输入框(表单场景:点击"用户名:"聚焦输入框)
QLabel *labelUser = new QLabel("用户名:", this);
QLineEdit *editUser = new QLineEdit(this);
labelUser->setBuddy(editUser); // 绑定伙伴:点击标签聚焦输入框
layout->addWidget(labelUser);
layout->addWidget(editUser);
// 示例2:标签关联复选框(选项场景:点击"记住密码"切换复选框)
QLabel *labelRemember = new QLabel("记住密码", this);
QCheckBox *checkRemember = new QCheckBox(this);
labelRemember->setBuddy(checkRemember); // 绑定伙伴:点击标签切换复选框
layout->addWidget(labelRemember);
layout->addWidget(checkRemember);
// 效果:点击"用户名:"聚焦用户名输入框,点击"记住密码"切换复选框状态
}
Widget::~Widget()
{
delete ui;
}
两个属性示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QLineEdit>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK,那么本文件我们来学系QLabel的openExternalLinks属性和buddy属性
//这两个属性都比较简单~~
//openExternalLinks属性就是控制QLable控件是否允许打开一个外部的链接(当 QLabel 文本内容包含 url 的时候涉及到)
//true即可,false不可
//但是需要我们注意的是,QLabel对于包含url是有要求的,就是这个链接要想能被用户点击去跳转
//那么该链接的格式得是html格式,我们之前也有学过,就是<a herf='url'>格式哦~~~
//而且QLabel的textFormat属性为Qt::RichText/Qt::AutoText时生效
//至于buddy属性,就是给QLabel关联一个伙伴,这样点击 QLabel 时就能激活对应的伙伴.
//例如伙伴如果是一个 QCheckBox, 那么该 QCheckBox 就会被选中,其实也是没什么用,qt终究没有像前端那么牛波一~~~
//常见于表单场景(如点击"用户名:"标签聚焦输入框,点击"记住密码"标签切换复选框状态)。
/**
* @property QLabel::openExternalLinks
* @brief QLabel的外部链接自动打开属性
* @details 该属性用于控制QLabel中文本内的超链接(<a href='URL'>形式)是否能直接调用系统默认浏览器打开,默认值为false;
* 仅当QLabel的文本包含HTML超链接标签,且textFormat为Qt::RichText/Qt::AutoText时生效,是QLabel拓展交互能力的核心属性之一。
*
* 【取值说明(通俗版)】
* | 取值 | 功能效果 |
* |-------|--------------------------------------------------------------------------|
* | true | 点击超链接时,Qt自动调用系统默认浏览器打开链接,无需编写任何槽函数; |
* | false | 点击超链接时仅触发linkActivated(QString)信号,需手动编写槽函数处理链接跳转(默认行为); |
*
* 【关联API详解】
* 1. bool openExternalLinks() const
* - 功能:获取是否允许自动打开外部链接
* - 返回值:true允许,false不允许(默认)
*
* 2. void setOpenExternalLinks(bool open)
* - 功能:开启/关闭超链接自动打开功能
* - 参数:open - true开启,false关闭
* - 示例:
* // 步骤1:设置富文本链接(需textFormat支持HTML解析)
* ui->label->setText("<a href='https://www.qt.io'>Qt官方网站</a>");
* // 步骤2:设置文本格式为富文本(或AutoText)
* ui->label->setTextFormat(Qt::RichText);
* // 步骤3:开启自动打开外部链接
* ui->label->setOpenExternalLinks(true);
* // 效果:点击"Qt官方网站"自动打开系统浏览器访问对应URL
*
* 【关键注意事项】
* 1. 生效前提:
* - 文本必须包含合法的HTML超链接标签(<a href='完整URL'>链接文本</a>);
* - textFormat需为Qt::RichText或Qt::AutoText(PlainText模式下链接标签会被原样显示,无交互);
* 2. 链接格式:URL必须是完整的(如https://www.qt.io),仅写域名(如www.qt.io)可能无法正常打开;
* 3. 信号兼容:即使开启true,点击链接仍会触发linkActivated信号(可同时监听做额外逻辑);
* 4. 平台适配:不同系统(Windows/macOS/Linux)打开浏览器的逻辑由Qt自动适配,无需额外处理。
*
* ---
*
* @property QLabel::buddy
* @brief QLabel的伙伴控件关联属性
* @details 该属性用于为QLabel绑定一个"伙伴控件"(QWidget子类),点击QLabel时会自动激活该伙伴控件,实现"标签联动交互";
* 核心作用是提升界面操作便捷性,常见于表单场景(如点击"用户名:"标签聚焦输入框,点击"记住密码"标签切换复选框状态)。
*
* 【核心交互逻辑(通俗版)】
* 绑定伙伴后点击QLabel的行为,由伙伴控件的类型决定:
* - 伙伴为QLineEdit/QTextEdit:自动聚焦到输入框(光标定位到输入框);
* - 伙伴为QCheckBox/QRadioButton:自动切换选中状态(勾选/取消勾选、选中/取消选中);
* - 伙伴为QPushButton:自动触发按钮点击(等效于点击按钮);
* - 伙伴为QComboBox:自动弹出下拉选项列表。
*
* 【关联API详解】
* 1. QWidget* buddy() const
* - 功能:获取当前关联的伙伴控件
* - 返回值:QWidget*类型,nullptr表示未关联任何伙伴
*
* 2. void setBuddy(QWidget *buddy)
* - 功能:为QLabel设置伙伴控件
* - 参数:buddy - 待关联的QWidget子类控件(需是当前界面的有效控件)
* - 示例1:标签关联输入框(表单场景)
* // 创建"用户名"标签和输入框
* QLabel* labelUser = new QLabel("用户名:", this);
* QLineEdit* editUser = new QLineEdit(this);
* // 绑定伙伴:点击"用户名:"标签,输入框自动获得焦点
* labelUser->setBuddy(editUser);
*
* - 示例2:标签关联复选框(选项场景)
* // 创建"记住密码"标签和复选框
* QLabel* labelRemember = new QLabel("记住密码", this);
* QCheckBox* checkRemember = new QCheckBox(this);
* // 绑定伙伴:点击"记住密码"标签,复选框自动切换选中状态
* labelRemember->setBuddy(checkRemember);
*
* 【关键注意事项】
* 1. 控件兼容:仅支持QWidget的可交互子类(QLineEdit/QCheckBox/QRadioButton等),纯展示控件(如另一个QLabel)绑定后无效果;
* 2. 作用范围:伙伴控件需与QLabel同属一个窗口,跨窗口绑定会失效;
* 3. 文本无影响:绑定伙伴后,QLabel的文本/图片显示逻辑不受任何影响;
* 4. 解绑方式:调用setBuddy(nullptr)可解除与伙伴控件的关联。
*
* 【典型组合示例】
* // 完整表单场景:标签+输入框/复选框的伙伴绑定
* QWidget* formWidget = new QWidget(this);
* QVBoxLayout* layout = new QVBoxLayout(formWidget);
*
* // 1. 用户名标签+输入框
* QLabel* labelUser = new QLabel("用户名:", formWidget);
* QLineEdit* editUser = new QLineEdit(formWidget);
* labelUser->setBuddy(editUser);
*
* // 2. 密码标签+输入框
* QLabel* labelPwd = new QLabel("密码:", formWidget);
* QLineEdit* editPwd = new QLineEdit(formWidget);
* editPwd->setEchoMode(QLineEdit::Password);
* labelPwd->setBuddy(editPwd);
*
* // 3. 记住密码标签+复选框
* QLabel* labelRemember = new QLabel("记住密码", formWidget);
* QCheckBox* checkRemember = new QCheckBox(formWidget);
* labelRemember->setBuddy(checkRemember);
*
* // 添加到布局
* layout->addWidget(labelUser);
* layout->addWidget(editUser);
* layout->addWidget(labelPwd);
* layout->addWidget(editPwd);
* layout->addWidget(labelRemember);
* layout->addWidget(checkRemember);
*
* // 效果:点击"用户名:"聚焦用户名输入框,点击"记住密码"切换复选框状态
*/
// ==========================================
// 1. openExternalLinks 属性示例
// ==========================================
QLabel *linkLabel = new QLabel(this);
// 设置富文本格式的超链接
linkLabel->setText("点击这里访问 <a href='https://www.qt.io'>Qt 官方网站</a> (已开启自动打开)");
linkLabel->setTextFormat(Qt::RichText); // 必须设置为富文本才能解析 HTML
// 关键设置:开启后点击链接直接调用系统浏览器
linkLabel->setOpenExternalLinks(true);
linkLabel->setStyleSheet("border: 1px solid #aaa; padding: 10px; background-color: #f9f9f9;");
// ==========================================
// 2. buddy 属性示例
// ==========================================
// 注意:buddy 属性本身是设置在"触发者"Label 上的,
// 而"被触发者"可以是界面上已有的任何其他 QWidget(包括另一个 QLabel)。
// 虽然 QLabel 作为 buddy 时交互效果不明显(因为 QLabel 默认不可聚焦、无选中状态),
// 但语法上是完全合法的,且如果目标 Label 设置了焦点策略或鼠标跟踪,仍可产生交互。
QLabel* label=new QLabel(this);
label->setText("user name:");
QLineEdit* lineedit=new QLineEdit(this);
label->setBuddy(lineedit);
label->move(100,100);
lineedit->move(200,100);
}
Widget::~Widget()
{
delete ui;
}
完整示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK大家,接下来我们要学习QLabel的属性喽,QLabel的使用率还是非常高的,我们会经常用到,所以需要学习一下~~~
/**
* @class QLabel
* @brief Qt中用于显示文本/图片的基础展示型控件
* @details QLabel是Qt界面中最核心的纯展示类控件,无默认交互能力(可通过配置buddy/链接拓展交互),
* 核心功能为显示文本(支持纯文本、富文本、Markdown)和图片(QPixmap),并提供丰富的样式控制属性(对齐、换行、缩进、边距等);
* 该控件继承自QFrame(具备边框样式能力),最终继承自QWidget,支持QWidget的通用样式配置(如大小、样式表)。
*
* 【核心属性详解】
* QLabel的显示效果由以下核心属性控制,所有属性均遵循"获取(xxx())+ 设置(setXxx())"的Qt统一API设计风格:
*
* ===================================== 属性1:text =====================================
* • 数据类型:QString
* • 核心作用:控制QLabel显示的文本内容,是文本展示的基础属性;
* 文本内容可结合textFormat属性适配不同格式(纯文本/富文本/Markdown),未设置时默认显示空字符串。
* • 关联API:
* 1. QString text() const → 获取当前显示的文本内容;
* 2. void setText(const QString &text) → 设置要显示的文本,设置后立即刷新界面。
* • 示例:
* ui->label->setText("Hello Qt!"); // 显示纯文本
* ui->label->setText("<h3 style='color:red;'>富文本标题</h3>"); // 结合textFormat=RichText显示富文本
*
* ===================================== 属性2:textFormat =====================================
* • 数据类型:Qt::TextFormat(枚举类型)
* • 核心作用:指定QLabel解析文本的格式规则,决定文本是否支持富文本/Markdown语法,默认值为Qt::AutoText。
* • 枚举值说明(通俗版):
* | 枚举值 | 功能说明 |
* |---------------------|--------------------------------------------------------------------------|
* | Qt::PlainText | 纯文本模式:忽略所有HTML/Markdown标签,按原始字符显示(如"<b>加粗</b>"会显示为普通字符串); |
* | Qt::RichText | 富文本模式:支持HTML标签(如<b>加粗</b>、<font color='red'>红色</font>、<br>换行); |
* | Qt::MarkdownText | Markdown模式:支持Markdown语法(如## 二级标题、**加粗**、*斜体*); |
* | Qt::AutoText | 自动识别模式:Qt自动检测文本内容,包含HTML/Markdown标签则按对应格式解析,否则按纯文本解析; |
* • 关联API:
* 1. Qt::TextFormat textFormat() const → 获取当前文本格式;
* 2. void setTextFormat(Qt::TextFormat format) → 设置文本解析格式。
* • 关键注意事项:
* - 若需显示纯文本但内容包含HTML标签(如用户输入的"<test>"),需设置为Qt::PlainText,避免被误解析;
* - Markdown模式仅支持Qt 5.14+版本,低版本使用会降级为纯文本。
*
* ===================================== 属性3:pixmap =====================================
* • 数据类型:QPixmap
* • 核心作用:控制QLabel显示的图片内容,设置后会覆盖文本显示(文本和图片无法同时显示,除非通过布局叠加);
* 图片来源支持本地文件、qrc资源文件、内存图像数据。
* • 关联API:
* 1. const QPixmap* pixmap() const → 获取当前显示的图片对象(无图片返回nullptr);
* 2. void setPixmap(const QPixmap &pixmap) → 设置要显示的图片。
* • 示例:
* ui->label->setPixmap(QPixmap(":/images/logo.png")); // 从qrc资源加载图片
* ui->label->setPixmap(QPixmap("D:/test.jpg").scaled(100, 100)); // 缩放图片后显示
*
* ===================================== 属性4:scaledContents =====================================
* • 数据类型:bool
* • 核心作用:控制QLabel的内容(文本/图片)是否自动拉伸以填充整个QLabel控件区域,默认值为false。
* • 取值说明:
* - true:内容自动拉伸至QLabel的宽高(图片可能变形,文本行高/字间距会适配);
* - false:内容保持原始尺寸(图片超出QLabel范围会被裁剪,文本按原始字体大小显示);
* • 关联API:
* 1. bool hasScaledContents() const → 获取是否开启自动拉伸;
* 2. void setScaledContents(bool enable) → 开启/关闭自动拉伸。
* • 关键注意事项:
* - 图片拉伸时若需保持宽高比,需先对QPixmap调用scaled(width, height, Qt::KeepAspectRatio),再设置到QLabel;
* - 文本拉伸仅适配显示范围,不会改变字体大小,需通过setFont()单独调整字体。
*
* ===================================== 属性5:alignment =====================================
* • 数据类型:Qt::Alignment(枚举组合)
* • 核心作用:控制QLabel内内容(文本/图片)的对齐方式,支持水平+垂直方向的组合配置,默认值为Qt::AlignLeft | Qt::AlignVCenter(左对齐+垂直居中)。
* • 常用枚举值(可通过|组合):
* - 水平方向:Qt::AlignLeft(左对齐)、Qt::AlignRight(右对齐)、Qt::AlignHCenter(水平居中)、Qt::AlignJustify(两端对齐);
* - 垂直方向:Qt::AlignTop(顶部对齐)、Qt::AlignBottom(底部对齐)、Qt::AlignVCenter(垂直居中);
* • 关联API:
* 1. Qt::Alignment alignment() const → 获取当前对齐方式;
* 2. void setAlignment(Qt::Alignment align) → 设置对齐方式。
* • 示例:
* ui->label->setAlignment(Qt::AlignCenter); // 水平+垂直居中(最常用)
* ui->label->setAlignment(Qt::AlignRight | Qt::AlignBottom); // 右下对齐
*
* ===================================== 属性6:wordWrap =====================================
* • 数据类型:bool
* • 核心作用:控制QLabel内的文本是否自动换行,仅对文本内容生效(图片无换行逻辑),默认值为false。
* • 取值说明:
* - true:文本超出QLabel宽度时自动换行,适配长文本显示;
* - false:文本超出宽度时被裁剪(末尾无省略号),仅显示单行;
* • 关联API:
* 1. bool wordWrap() const → 获取是否开启自动换行;
* 2. void setWordWrap(bool on) → 开启/关闭自动换行。
* • 关键注意事项:
* - 自动换行仅在QLabel宽度固定时生效(如setFixedWidth(200)),宽度自适应时无换行效果;
* - 富文本中的<br>标签优先级高于wordWrap,即使关闭wordWrap,<br>仍会强制换行。
*
* ===================================== 属性7:indent =====================================
* • 数据类型:int
* • 核心作用:设置文本的缩进距离(单位:像素),缩进方向由alignment属性决定,仅对文本生效。
* • 缩进规则(通俗版):
* - 水平对齐为左对齐(AlignLeft):缩进文本左侧空白(相当于文本向右移);
* - 水平对齐为右对齐(AlignRight):缩进文本右侧空白(相当于文本向左移);
* - 垂直对齐为顶部/底部:缩进文本垂直方向空白;
* - 居中对齐(AlignHCenter/AlignVCenter):indent无效;
* • 关联API:
* 1. int indent() const → 获取缩进像素值;
* 2. void setIndent(int indent) → 设置缩进值(负数无效果,默认0)。
* • 示例:
* ui->label->setAlignment(Qt::AlignLeft);
* ui->label->setIndent(20); // 文本左侧缩进20像素
*
* ===================================== 属性8:margin =====================================
* • 数据类型:int
* • 核心作用:设置QLabel内部内容(文本/图片)与QLabel边框之间的内边距(单位:像素),上下左右四个方向同时生效,默认值为0。
* • 与indent的核心区别(通俗版):
* | 特性 | indent(缩进)| margin(内边距)|
* |--------------|-------------------------|---------------------------|
* | 生效方向 | 最多2个方向(随对齐变化) | 上下左右4个方向同时生效 |
* | 作用对象 | 仅文本 | 文本/图片均生效 |
* | 居中对齐时 | 无效 | 仍生效(内容与边框留空白) |
* • 关联API:
* 1. int margin() const → 获取内边距像素值;
* 2. void setMargin(int margin) → 设置内边距值(负数无效果,默认0)。
* • 示例:
* ui->label->setMargin(10); // 内容与边框的上下左右均保留10像素空白
*
* ===================================== 属性9:openExternalLinks =====================================
* • 数据类型:bool
* • 核心作用:控制QLabel中的超链接(如<a href='https://www.qt.io'>Qt官网</a>)是否可直接打开,默认值为false。
* • 取值说明:
* - true:点击超链接时,Qt自动调用系统默认浏览器打开链接,无需额外代码;
* - false:点击超链接仅触发linkActivated信号,需手动编写槽函数处理链接跳转;
* • 关联API:
* 1. bool openExternalLinks() const → 获取是否允许打开外部链接;
* 2. void setOpenExternalLinks(bool open) → 开启/关闭自动打开链接。
* • 示例:
* ui->label->setText("<a href='https://www.qt.io'>Qt官网</a>");
* ui->label->setTextFormat(Qt::RichText);
* ui->label->setOpenExternalLinks(true); // 点击链接自动打开浏览器
*
* ===================================== 属性10:buddy =====================================
* • 数据类型:QWidget*
* • 核心作用:为QLabel关联一个"伙伴控件",点击QLabel时会自动激活该伙伴控件(如聚焦输入框、切换复选框状态);
* 常用于表单标签(如"用户名:"标签关联输入框,点击标签聚焦输入框)。
* • 关联API:
* 1. QWidget* buddy() const → 获取关联的伙伴控件;
* 2. void setBuddy(QWidget *buddy) → 设置伙伴控件。
* • 示例:
* // 关联"用户名:"标签到输入框,点击标签时输入框获得焦点
* QLabel* labelUser = new QLabel("用户名:", this);
* QLineEdit* editUser = new QLineEdit(this);
* labelUser->setBuddy(editUser);
* // 关联"记住密码"标签到复选框,点击标签切换复选框状态
* QLabel* labelRemember = new QLabel("记住密码", this);
* QCheckBox* checkRemember = new QCheckBox(this);
* labelRemember->setBuddy(checkRemember);
*
* 【典型使用场景示例】
* ===================================== 场景1:显示富文本 =====================================
* QLabel* richLabel = new QLabel(this);
* richLabel->setText("<font color='blue' size='5'>Qt教程</font><br><b>QLabel富文本示例</b>");
* richLabel->setTextFormat(Qt::RichText);
* richLabel->setAlignment(Qt::AlignCenter);
*
* ===================================== 场景2:显示带边距的图片 =====================================
* QLabel* imgLabel = new QLabel(this);
* imgLabel->setPixmap(QPixmap(":/images/pic.jpg"));
* imgLabel->setScaledContents(true); // 图片拉伸填充标签
* imgLabel->setMargin(5); // 图片与边框留5像素空白
* imgLabel->setFixedSize(200, 200);
*
* ===================================== 场景3:表单标签关联输入框 =====================================
* QLabel* labelEmail = new QLabel("邮箱:", this);
* QLineEdit* editEmail = new QLineEdit(this);
* labelEmail->setBuddy(editEmail); // 点击"邮箱:"聚焦输入框
*/
}
Widget::~Widget()
{
delete ui;
}
第六章 全文总结与学习建议
恭喜你!终于看完了这篇 QLabel 常见属性详细解析!
如果你跟着文章一步步敲了代码,做了练习,那么现在你已经完全掌握了 QLabel 最核心的内容:
- 你会用
text和textFormat显示纯文本、富文本、Markdown 文本; - 你会用
pixmap和scaledContents显示图片,还会重写resizeEvent让图片随窗口大小变化; - 你会用
alignment、wordWrap、indent、margin控制文本的位置、换行、间距; - 你会用
openExternalLinks实现超链接跳转,用buddy实现标签联动交互; - 你还知道了 QPixmap 的基础用法,以及它和 QImage 的区别。
毫不夸张地说,掌握了这些内容,你就掌握了 QLabel 开发的 90% 以上的需求!接下来,你可以用这些内容,让你的界面展示效果更丰富、更美观、更易用。
6.1 核心要点回顾
在结束之前,我们最后再回顾一下这篇文章的核心要点:
- 继承关系:QLabel → QFrame → QWidget,QWidget 和 QFrame 的所有属性、方法 QLabel 都能用;
- 文本展示 :
text是文本内容,textFormat是文本解析格式(PlainText/RichText/MarkdownText/AutoText);- 图片优先:设置
pixmap后,text会被覆盖;
- 图片展示 :
pixmap是图片内容,用 QPixmap 加载,展示图片优先用 QPixmap,编辑图片优先用 QImage;scaledContents控制内容是否拉伸填充(true可能变形,推荐手动缩放 QPixmap 配合false);- 重写
resizeEvent可以让图片随窗口大小变化;
- 文本布局与样式 :
alignment控制对齐方式(水平 + 垂直组合,常用Qt::AlignCenter);wordWrap控制自动换行(必须固定宽度才生效);margin控制内边距(四方向同时生效,常用,推荐setContentsMargins);indent控制文本缩进(随对齐方式变化,居中无效,较鸡肋);
- 轻量交互 :
openExternalLinks控制超链接自动打开(配合 RichText 或 AutoText 使用);buddy关联伙伴控件(点击标签激活伙伴,常用表单场景)。
6.2 最后的话
编程学习没有捷径,唯手熟尔。QLabel 的属性虽然看起来很多,但只要你多敲代码、多做练习、多踩坑、多排查,很快就能熟练掌握。
这篇文章虽然很长,但我相信,如果你认真看完了,跟着敲了代码,你一定会对 QLabel 有一个极其深刻的理解,再也不会为界面展示发愁。
感谢你阅读这篇文章,希望它能帮到你。我们下一篇 Qt 教程再见!