Qt常用控件之标签QLabel
标签QLabel
QLabel 标签用来显示文本和图片,在 Qt 中使用频率很高。
1. Label属性
| 属性 | 说明 | 
|---|---|
| text | QLabel 中的文本。 | 
| textFormat | 文本的格式。其中 Qt::PlainText 为纯文本;Qt::RichText 为富文本(支持 html 格式); Qt::MarkdownText 为 markdown 格式; Qt::AutoText 为根据内容自动决定文本格式。 | 
| pixmap | QLabel 内部包含的图片。 | 
| scaledContents | 为 true 表示内容自动拉伸填充,为 false 则不会。(如自动填充图片) | 
| alignment | 对齐方案。可以设置水平和垂直方向如何对齐。 | 
| wordWrap | 为 true 内部的文本会自动换行,为 false 则不会。 | 
| indent | 设置文本缩进,水平和垂直方向都生效。 | 
| margin | 内部文本和边框之间的边距。(与 indent 的不同点在于,margin 在上下左右四个方向都生效,而 indent 只生效两个方向) | 
| openExternalLink | 是否允许打开一个外部链接(如当 QLabel 文本包含一个 url 时)。 | 
| buddy | 让 QLabel 关联一个 “伙伴” ,点击 QLabel 时就会激活对应的伙伴(如伙伴是一个 QCheckBox ,那么该 QCheckBox 就会被选中)。 | 
2. 更改label的文本格式
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setTextFormat(Qt::PlainText);
    ui->label->setText("这是一段纯文本");
    ui->label_2->setTextFormat(Qt::RichText);
    ui->label_2->setText("<b>这是一段富文本</b>");
    ui->label_3->setTextFormat(Qt::MarkdownText);
    ui->label_3->setText("## 这是一段markdown");
}
Widget::~Widget()
{
    delete ui;
}
 

3. QLabel设置图片
如果要对 QLabel 控件设置图片,可以使用 setPixmap() 接口设置 QLabel 的 pixmap 属性,将图片添加到 QLabel 中,然后将 setScaledContents(true),这样图片就会自动填充,与 QLabel 的大小保持一致。
接着,可以将 QLabel 设置为与窗口大小一致,使用:
void setGeometry(int x, int y, int w, int h)
void setGeometry(const QRect &)
 
但要注意的是,如果是直接设置值,那么当窗口被拖拽时,QLabel 的大小是不会随窗口大小改变的。实际上,当我们拖拽放大或缩小窗口时,会持续触发窗口的 resize 事件(resizeEvent)。同时,Qt 为该事件留下了一个 size() 接口,用于获取窗口改变后的 QRect 对象。
我们只需要重写该事件的虚函数,让每次拖拽窗口时,都更新 QLabel 的大小即可:
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setPixmap(QPixmap(":/jienigui.jpg"));
    ui->label->setScaledContents(true);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::resizeEvent(QResizeEvent *event)
{
    ui->label->setGeometry(0,0,event->size().width(),event->size().height());
    /*这里写this->width()也是可以的,
    主要是通过重写resizeEvent()让QLabel的大小随事件的触发进行调整*/
}
 
注意要在 widget.h 里添加
resizeEvent的声明,以及添加#include <QResizeEvent>头文件。

拖拽窗口改变窗口的大小,图片会随之改变大小。
4. 设置QLabel文本对齐方式
首先为了方便查看 QLabel 的边界,可以在控件右侧的 QFrame 中设置 frameShape ,选择能看到四个边框的属性即可:

然后,在代码中使用 setAlignment() 接口设置文本的对齐方式即可,文本对齐有四个枚举变量:
| 枚举变量 | 作用 | 
|---|---|
| Qt::AlignLeft | 左对齐 | 
| Qt::AlignRight | 右对齐 | 
| Qt::AlignTop | 上对齐 | 
| Qt::AlignBottom | 下对齐 | 
| Qt::AlignHCenter | 水平居中对齐 | 
| Qt::AlignVCenter | 垂直方向居中对齐 | 
| Qt::AlignBaseline | 垂直与基线对齐 | 
| Qt::AlignJustify | 水平方向调整间距两端对齐 | 
可以使用
|使用多种对齐方式,如Qt::AlignLeft|Qt::AlignTop是左上对齐,Qt::AlignCenter等价于Qt::AlignHCenter | Qt::AlignVCenter。
5. 设置QLabel自动换行
使用 setWordWrap(true) 可以将 wordWrap 属性设置为自动换行:
//widge.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setWordWrap(true);
    ui->label->setText("人生就是起起落落落落落落落落落落落落落落落落落落落落落落落落落落");
}
Widget::~Widget()
{
    delete ui;
}
 

6. 设置QLabel缩进
使用 setIndent(int px) 接口可以设置 QLabel 的缩进长度,填入一个整数表示缩进的像素。注意 ident 是全文缩进,即文本所有的行都会缩进该值,且 indent 只在两个方向上生效,具体哪个方向要看 alignment 是如何对齐的。
//widge.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setWordWrap(true);
    ui->label->setAlignment(Qt::AlignLeft);
    ui->label->setIndent(40);
    ui->label->setText("人生就是起起落落落落落落落落落落落落落落落落落落落落落落落落落落");
    ui->label_2->setWordWrap(true);
    ui->label_2->setAlignment(Qt::AlignLeft|Qt::AlignTop);
    ui->label_2->setIndent(40);
    ui->label_2->setText("人生就是起起落落落落落落落落落落落落落落落落落落落落落落落落落落");
}
Widget::~Widget()
{
    delete ui;
}
 

可以看到
label设置为左对齐,只有左边被缩进了40个像素,而label_2设置了左上对齐,左边和上边都被缩进了40个像素。
7. 设置QLabel边距
使用 setMargin() 接口可以设置 QLabel 的左右边距。与 indent 属性不同的是,margin 的边距在四个方向上都生效:
//widge.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setWordWrap(true);
    ui->label->setAlignment(Qt::AlignLeft);
    ui->label->setMargin(40);
    ui->label->setText("人生就是起起落落落落落落落落落落落落落落落落落落落落落落落落落落");
    ui->label_2->setWordWrap(true);
    ui->label_2->setAlignment(Qt::AlignLeft|Qt::AlignTop);
    ui->label_2->setMargin(40);
    ui->label_2->setText("人生就是起起落落落落落落落落落落落落落落落落落落落落落落落落落落");
}
Widget::~Widget()
{
    delete ui;
}
 

可以看到对齐方式没有影响到
margin属性的边距。
8. QLabel设置伙伴关系
当 QLabel 设置了一个 CheckBox 为伙伴关系后,在 QLabel 的文本中写上 &[key](例如 &A ),可以将 Ctrl+A 设置为 QLabel 的快捷键,而 QLabel 与 CheckBox 绑定了伙伴关系,该 CheckBox 就会被选中。实际这个功能好像也没有什么用。
