【Qt】常用控件QLabel
大柏怎么被偷了 2024-09-13 08:05:05 阅读 72
常用控件QLabel
QLabel可以用来显示文本和图片。
QLabel的属性
其核心属性如下:
属性 | 说明 |
---|---|
text
| QLabel 中的⽂本
|
textFormat
| ⽂本的格式.
Qt::PlainText 纯⽂本Qt::RichText 富⽂本(⽀持 html 标签)Qt::MarkdownText markdown 格式Qt::AutoText 根据⽂本内容⾃动决定⽂本格式. |
pixmap
| QLabel 内部包含的图⽚
|
scaledContents
| 设为 true 表⽰内容⾃动拉伸填充 QLabel
设为 false 则不会⾃动拉伸
|
alignment
| 对⻬⽅式.
可以设置⽔平和垂直⽅向如何对⻬.
|
wordWrap
| 设为 true 内部的⽂本会⾃动换⾏.
设为 false 则内部⽂本不会⾃动换⾏
|
indent
| 设置⽂本缩进. ⽔平和垂直⽅向都⽣效
|
margin
| 内部⽂本和边框之间的边距.
不同于于 indent, 但是是上下左右四个⽅向都同时有效.
⽽ indent 最多只是两个⽅向有效(具体哪两个⽅向有效取决于 alignment )
|
openExternalLinks
| 是否允许打开⼀个外部的链接.
(当 QLabel ⽂本内容包含 url 的时候涉及到)
|
buddy
| 给 QLabel 关联⼀个 "伙伴" , 这样点击 QLabel 时就能激活对应的伙伴。
例如伙伴如果是⼀个 QCheckBox, 那么该 QCheckBox 就会被选中。
|
关于testFormat
纯文本:最普通的文本
富文本:内容更丰富的文本,支持html(例如word工具,编辑的文件就可以认为是一种富文本)
markdown:是一个非常常用的书写文档的格式,提供了各种特殊符号,表示不同的样式/格式。
例子:显示不同格式的文本
<b>这是一段富文本</b>
使用<b>标签,表示文本加粗。
如果将< b>标签加到纯文本中,只是被当成了单纯的文本,没有进行任何的渲染操作。
纯文本中,#只是被当成了文本"#"
在mark down中,# 是一级标题
代码展示:
<code>#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//把第一个label文本设置成显示纯文本
ui->label->setTextFormat(Qt::PlainText);
ui->label->setText("# 这是一段纯文本");
//把第二个label文本设置成显示富文本
ui->label_2->setTextFormat(Qt::RichText);
ui->label_2->setText("<b>这是一段富文本</b>");
//把第三个label文本设置成显示 markdown
ui->label_3->setTextFormat(Qt::MarkdownText);
ui->label_3->setText("# 这是一段 markdown 文本");
}
Widget::~Widget()
{
delete ui;
}
例子:显示图片
在代码中直接写固定数据,这样的做法称为“硬编码”。
窗口的尺寸为 800 * 600
QLabel的尺寸为 800 * 600
而图片的尺寸不一定是800*600
代码实现:
<code>#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//将QLabel设置成与窗口大小一致
QRect windowrRect = this->geometry();
//ui->label->setGeometry(0, 0, 800, 600);
ui->label->setGeometry(0, 0, windowrRect.width(), windowrRect.height());
//将图片导入到标签
QPixmap pixmap(":/Qt.png");
ui->label->setPixmap(pixmap);
//自动拉伸属性
ui->label->setScaledContents(true);
}
Widget::~Widget()
{
delete ui;
}
在刚才的代码中QLabel的尺寸设置是在构造函数里面,这种设置相当于是一次性的,一旦程序运行起来之后,QLabel的尺寸就固定下来了,窗口发生改变,此时,QLabel是不会变化的。
需要QLabel随着窗口的变化实时发生改变。
Qt中,表示用户的操作,有俩类操作,一类是信号,,一类是事件。
当用户拖拽修改窗口大小的时候,就会触发resize事件(resizeEvent)
像resize这样的事件,是连续变化的,把窗口尺寸从A拖到B这个过程中,会触发一系列的resizeEvent。
此时就可以借助resizeEvent来完成上述的功能。
即可以让Widget窗口类重写父类(QWidget的resizeEvent虚函数)
在鼠标拖动窗口的过程中这个虚函数就会被反复调用执行,每次触发一个resizeEvent事件都会调用一次对应的虚函数。
由于此处进行了函数重写,调用父类的虚函数就会实际调用到子类的对应的函数(多态)
此处的形参event是非常有用的,这里包含了触发resize事件这一时刻窗口的尺寸的数值
在实际编程中,指定回调函数其实存在多种方式:
(1)设置函数指针
(2)设置仿函数(函数对象)
(3)设置lambda
(4)通过重写父类虚函数(框架中拿着父类的指针调用这个函数,如果创建了子类重写了这个函数,在多态机制下,实际执行的就是子类的函数)
(5)Qt的信号槽
<code>#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QResizeEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//将QLabel设置成与窗口大小一致
QRect windowrRect = this->geometry();
//ui->label->setGeometry(0, 0, 800, 600);
ui->label->setGeometry(0, 0, windowrRect.width(), windowrRect.height());
//将图片导入到标签
QPixmap pixmap(":/Qt.png");
ui->label->setPixmap(pixmap);
//自动拉伸属性
ui->label->setScaledContents(true);
}
Widget::~Widget()
{
delete ui;
}
void Widget::resizeEvent(QResizeEvent *event)
{
qDebug() << event->size();
ui->label->setGeometry(0, 0, event->size().width(), event->size().height());
}
例子:文本对齐、自动换行、缩进、边距
在Qt Designer中设置四个label
QFrame是QLabel的父类,其中frameShape属性用来设置边框性质
NoFrame:无边框Box:矩形边框panel:带有可点击区域的⾯板边框WinPanel:Windows⻛格的边框HLine:⽔平线边框VLine:垂直线边框StyledPanel:带有可点击区域的⾯板边框,但样式取决于窗⼝主题
编写widget.cpp,给四个label设置4个属性
| 在C++中是按位或
此处设置的缩进即使文本进行换行,后续的行也会产生缩进,不仅仅是首行缩进。
在前端中,CSS也能设置缩进,text-indent属性,首行缩进。
代码实现:
<code>#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置对齐方式
ui->label->setText("这是一段文本");
ui->label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
//设置自动换行
ui->label_2->setText("这是一段很长很长很长很长很长很长很长很长很长很长很长很长"
"很长很长很长很长很长很长很长很长很长很长很长很长很长很长"
"很长很长很长很长很长很长很长很长很长很长很长很长很长很长"
"的文本");
ui->label_2->setWordWrap(true);
//设置缩进
ui->label_3->setText("这是一段很长很长很长很长很长很长很长很长很长很长很长很长"
"很长很长很长很长很长很长很长很长很长很长很长很长很长很长"
"很长很长很长很长很长很长很长很长很长很长很长很长很长很长"
"的文本");
ui->label_3->setWordWrap(true);
ui->label_3->setIndent(50);
//设置边距
ui->label_4->setText("这是一段很长很长很长很长很长很长很长很长很长很长很长很长"
"很长很长很长很长很长很长很长很长很长很长很长很长很长很长"
"很长很长很长很长很长很长很长很长很长很长很长很长很长很长"
"的文本");
ui->label_4->setWordWrap(true);
ui->label_4->setMargin(60);
}
Widget::~Widget()
{
delete ui;
}
运⾏程序, 可以看到如下效果
第⼀个 label 垂直⽔平居中第⼆个 label 设置了 wordWrap, 能够⾃动换⾏第三个 label 设置了 Indent, 左侧和上⽅和边框有间距. 右侧则没有.第四个 label 设置了 margin, 四个⽅向均有间距(图上仅体现出三个⽅向, 下⽅看不出来)
例子:设置伙伴
运⾏程序, 可以看到, 按下快捷键 alt + a 或者 alt + b, 即可选中对应的选项
在Qt中,QLabel中写的文本,是可以指定“快捷键”,此处的快捷键的规则功能要比QPushButton弱很多,是在文本中使用& 跟上一个字符来表示快捷键。
比如:&A => 通过键盘上的alt + a来触发这个快捷键。
&B => 通过键盘上的alt + b来触发这个快捷键。
绑定伙伴关系之后,通过快捷键就可以选中对应的单选按钮/复选按钮
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。