【Qt常用控件】—— 显示类控件

目录

1.1 Label

1.2 LCD Number 

 1.3 ProgressBar

 1.4 Calendar Widget

 1.5 小结


1.1 Label

QLabel 控件是 Qt 中用于显示文本或图像的部件,是用户界面开发中常用的组件之一。 核⼼属性如下:
属性
说明
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 就会被选中.
代码⽰例: 显⽰不同格式的⽂本

 1) 在界⾯上创建三个 QLabel

  • 尺⼨放⼤⼀些. objectName 分别为 label, label_2, label_3

2) 修改 widget.cpp, 设置三个 label 的属性  

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 ⽂本");
}
3) 运⾏程序, 观察效果


代码示例: 显⽰图⽚ 

  • 虽然 QPushButton 也可以通过设置图标的⽅式设置图⽚, 但是并⾮是⼀个好的选择. 更多的时候还是希望通过 QLabel 来作为⼀个更单纯的显⽰图⽚的⽅式.
1) 在界面上创建⼀个 QLabel, objectName label

2) 创建 resource.qrc ⽂件, 并把图⽚导⼊到 qrc 中.

3) 修改 widget.cpp, 给 QLabel 设置图⽚
// 设置 label ⼤⼩和窗⼝⼀样⼤
ui->label->setGeometry(0, 0, 800, 600);QPixmap pixmap(":/huaji.png");
ui->label->setPixmap(pixmap);
  • 执⾏程序, 观察效果

  • 这个图⽚本⾝的尺⼨是 480 * 480, 并没有把 QLabel 填充满
4) 修改代码, 设置 scaledContents 属性
// 设置内容伸缩
ui->label->setScaledContents(true);
  • 再次运⾏, 观察效果, 可以看到图⽚已经被拉伸, 可以把窗⼝填满了.

5) 此时, 如果拖动窗⼝⼤⼩, 可以看到图⽚并不会随着窗口大小的改变而同步变化.

  • 为了解决这个问题, 可以在 Widget 中重写 resizeEvent 函数.  
// 重写 resizeEvent. 这个函数会在窗⼝⼤⼩发⽣改变时被⾃动调⽤.
void Widget::resizeEvent(QResizeEvent *event) {// 可以直接通过 this->width() 和 this->height() 设置 label 新的尺⼨//也可以通过event 参数拿到新的尺⼨.// ui->label->setGeometry(0, 0, this->width(), this->height());ui->label->setGeometry(0, 0, event->size().width(), event->size().height());qDebug() << event->size();
}
  • 执⾏程序, 此时改变窗⼝⼤⼩, 图⽚也会随之变化.  

  • 于此同时, 在控制台⾥也能够看到尺⼨变化的过程.

此处的 resizeEvent 函数我们没有⼿动调⽤, 但是能在窗⼝⼤⼩变化时被⾃动调⽤.

这个过程就是依赖 C++ 中的多态来实现的. Qt 框架内部管理着 QWidget 对象表⽰咱们的窗 ⼝. 在窗⼝⼤⼩发⽣改变时, Qt 就会⾃动调⽤ resizeEvent 函数.
但是由于实际上这个表⽰窗⼝的并⾮是 QWidget, ⽽是 QWidget 的⼦类, 也就是咱们⾃⼰写 的 Widget. 此时虽然是通过⽗类调⽤函数, 但是实际上执⾏的是⼦类的函数(也就是我们重写 后的 resizeEvent ).
此处属于是 多态 机制的⼀种经典⽤法. 通过上述过程, 就可以把⾃定义的代码, 插⼊到框架内 部执⾏. 相当于 "注册回调函数" .

1.2 LCD Number 

QLCDNumber 控件是 Qt 中用于显示数字或文本的 LCD 部件。它模拟了一个数字显示器(如数字钟或计时器)的外观。

核⼼属性
属性
说明
intValue
QLCDNumber 显⽰的数字值(int).
value
QLCDNumber 显⽰的数字值(double).和 intValue 是联动的.
例如给 value 设为 1.5, intValue 的值就是 2.
另外, 设置 value 和 intValue 的⽅法名字为 display , ⽽不是 setValue 或者 setIntValue .
digitCoun
显⽰⼏位数字.
mode
数字显⽰形式.
1. QLCDNumber::Dec :⼗进制模式,显⽰常规的⼗进制数字。
2. QLCDNumber::Hex :⼗六进制模式,以⼗六进制格式显⽰数字。
3. QLCDNumber::Bin :⼆进制模式,以⼆进制格式显⽰数字。
4. QLCDNumber::Oct :⼋进制模式,以⼋进制格式显⽰数字。
只有⼗进制的时候才能显⽰⼩数点后的内容.
segmentStyle
设置显⽰⻛格.
1. QLCDNumber::Flat :平⾯的显⽰⻛格,数字呈现在⼀个平坦的表⾯上。
2. QLCDNumber::Outline :轮廓显⽰⻛格,数字具有清晰的轮廓和阴影效果。
3. QLCDNumber::Filled :填充显⽰⻛格,数字被填充颜⾊并与背景区分开。
smallDecimalPoin
设置⽐较⼩的⼩数点.
代码⽰例: 倒计时
1) 在界⾯上创建⼀个 QLCDNumber , 初始值设为 10. objectName 为 lcdNumber

2) 修改 widget.h 代码, 创建⼀个 QTimer 成员, 和⼀个 updateTime 函数
QTimer* timer;void updateTime();
3) 修改 widget.cpp, 在构造函数中初始化 QTimer
  • QTimer 表⽰定时器. 通过 start ⽅法启动定时器之后, 就会每隔⼀定周期, 触发⼀次 QTimer::timeout 信号.
  • 使⽤ connect QTimer::timeout 信号和 Widget::updateTime 连接起来, 意味着每 次触发 QTimer::timeout 都会执⾏ Widget::updateTime
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建 QTimer 实例timer = new QTimer(this);// 连接信号槽. QTimer 会每隔⼀定的时间触发⼀个 timeout 信号. 现在把 timeout 信号//和 updateTime 连接起来.// 此时意味着每次触发 timeout 信号都会伴随 updateTime 函数的执⾏.connect(timer, &QTimer::timeout, this, &Widget::updateTime);// 启动 QTimer, 并且规定每隔 1000ms 触发⼀次 timeout 信号.timer->start(1000);
}
4) 修改 widget.cpp, 实现 updateTime
  • 通过 intValue 获取到 QLCDNumber 内部的数值.
  • 如果 value 的值归 0 了, 就停⽌ QTimer . 接下来 QTimer 也就不会触发 timeout 信号了.
void Widget::updateTime() {qDebug() << "updateTime";int value = ui->lcdNumber->intValue();if (value <= 0) {// 如果时间到, 停⽌定时器.timer->stop();return;}ui->lcdNumber->display(value - 1);
}

 5) 执⾏程序, 可以看到每隔⼀秒钟, 显⽰的数字就减少 1.

针对上述代码, 存在两个问题:
1) 上述代码如果直接在 Widget 构造函数中, 通过⼀个循环 + sleep 的⽅式是否可以呢?
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);int value = ui->lcdNumber->intValue();while (true) {std::this_thread::sleep_for(std::chrono::seconds(1));if (value <= 0) {break;}ui->lcdNumber->display(value - 1);}
}
  • 显然, 这个代码是不⾏的. 循环会使 Widget 的构造函数⽆法执⾏完毕, 此时界⾯是不能正确构造和显⽰的.
2) 上述代码如果是在 Widget 构造函数中, 另起⼀个线程, 在新线程中完成 循环 + sleep 是否可以呢?
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);std::thread t([this]() {int value = this->ui->lcdNumber->intValue();while (true) {std::this_thread::sleep_for(std::chrono::seconds(1));if (value <= 0) {break;}this->ui->lcdNumber->display(value - 1);}});
}
  • 这个代码同样是不⾏的. Qt 中规定, 任何对于 GUI 上内容的操作, 必须在主线程中完成. 像 Widget 构造函数, 以及 connect 连接的 slot 函数, 都是在主线程中调⽤的. ⽽我们⾃⼰创建的线程则不是.
  • 当我们⾃⼰的线程中尝试对界⾯元素进⾏修改时, Qt 程序往往会直接崩溃.

 这样的约定主要是因为 GUI 中的状态往往是牵⼀发动全⾝的, 修改⼀个地⽅, 就需要同步的对 其他内容进⾏调整.

⽐如调整了某个元素的尺⼨, 就可能影响到内部的⽂字位置, 或者其他元素的位置. 这⾥⼀连串的修改, 都是需要按照⼀定的顺序来完成的.
由于多线程执⾏的顺序⽆法保障, 因此 Qt 从根本上禁⽌了其他线程修改 GUI 状态, 避免后续的⼀系列问题.
综上所述, 使⽤定时器, 是实现上述功能的最合理⽅案.

 1.3 ProgressBar

使⽤ QProgressBar 表⽰⼀个进度条

核⼼属性
属性
说明
minimum
进度条最⼩值
maximum
进度条最⼤值
value
进度条当前值
alignment
⽂本在进度条中的对⻬⽅式. Qt::AlignLeft : 左对⻬
Qt::AlignRight : 右对⻬
Qt::AlignCenter : 居中对⻬
Qt::AlignJustify : 两端对⻬
textVisible
进度条的数字是否可⻅.
orientation
进度条的⽅向是⽔平还是垂直
invertAppearance
是否是朝反⽅向增⻓进度
textDirection
⽂本的朝向.
format
展⽰的数字格式.
%p :表⽰进度的百分⽐(0-100)
%v :表⽰进度的数值(0-100)
%m :表⽰剩余时间(以毫秒为单位)
%t :表⽰总时间(以毫秒为单位)
代码⽰例: 设置进度条按时间增⻓

1) 在界⾯上创建进度条, objectName progressBar

2) 修改 widget.h, 创建 QTimer updateProgressBar 函数.

  • 其中最⼩值设为 0, 最⼤值设为 100. 当前值设为 0.
QTimer* timer;
void updateProgressBar ();

3) 修改 widget.cpp, 初始化 QTimer

  • 此处设置 100ms 触发⼀次 timeout 信号. 也就是⼀秒钟触发 10 次.
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &Widget::updateProgressBar);timer->start(100);
}

4) 修改 widget.cpp, 实现 updateProgressBar

void Widget::updateProgressBar() {int value = ui->progressBar->value();if (value >= 100) {timer->stop();return;}ui->progressBar->setValue(value + 1);
}

5) 运⾏程序, 可以看到进度条中的进度在快速增⻓.

在实际开发中, 进度条的取值, 往往是根据当前任务的实际进度来进⾏设置的.
  • ⽐如需要读取⼀个很⼤的⽂件, 就可以获取⽂件的总的⼤⼩, 和当前读取完毕的⼤⼩, 来设置进度条的⽐例.
由于上⾯我们介绍了 Qt 禁⽌在其他线程修改界⾯, 因此进度条的更新往往也是需要搭配定时 器来完成的.
通过定时器周期触发信号, 主线程调⽤对应的 slot 函数. 再在 slot 函数中对当前的任务进度进 ⾏计算, 并更新进度条的界⾯效果

 1.4 Calendar Widget

QCalendarWidget 表⽰⼀个 "⽇历" , 形如:

属性
说明
selectDate
当前选中的⽇期
minimumDate
最⼩⽇期
maximumDate
最⼤⽇期
firstDayOfWeek
每周的第⼀天(也就是⽇历的第⼀列) 是周⼏.
gridVisible
是否显⽰表格的边框
selectionMode
是否允许选择⽇期
navigationBarVisible
⽇历上⽅标题是否显⽰
horizontalHeaderFormat
⽇历上⽅标题显⽰的⽇期格式
verticalHeaderFormat
⽇历第⼀列显⽰的内容格式
dateEditEnabled
是否允许⽇期被编辑

 重要信号

信号
说明
selectionChanged(const
QDate&)
当选中的⽇期发⽣改变时发出
activated(const QDate&)
当双击⼀个有效的⽇期或者按下回⻋键时发出,形参是⼀个QDate类型,保存 了选中的⽇期
currentPageChanged(int,
int)
当年份⽉份改变时发出,形参表⽰改变后的新年份和⽉份
代码⽰例: 获取选中的⽇期
1) 在界⾯上创建⼀个 QCalendarWidget 和 ⼀个 label objectName 为 calendarWidget , label

 

2) 给 QCalendarWidget 添加 slot 函数 

void Widget::on_calendarWidget_selectionChanged()
{QDate date = ui->calendarWidget->selectedDate();qDebug() << date;ui->label->setText(date.toString());
}
3) 执⾏程序, 可以看到当选择不同的⽇期时, label 中的内容就会随之改变.


 1.5 小结

显示类控件是用于在用户界面中显示信息的各种元素,它们可以展示文本、数字、图像等内容。以下是常见的显示类控件及其功能小结:

  1. QLabel

    • 用于显示文本或图像。
    • 支持丰富的文本格式和样式。
    • 可以设置对齐方式、文本颜色、背景颜色等。
  2. QLCDNumber

    • 用于模拟数字显示器,显示数字或文本。
    • 支持设置数字位数、样式、显示模式等。
  3. QProgressBar

    • 用于显示任务进度。
    • 可以水平或垂直显示,支持设定范围和当前值。
  4. QCalendarWidget

    • 显示一个可视的月份日历,用户可以在日历上选择日期。
    • 用户可以通过点击日历上的日期来选择特定的日期。

这些控件在 GUI 开发中经常被使用,可以帮助用户展示和处理各种类型的信息,提高用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2981867.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL主从结构搭建

说明&#xff1a;本文介绍如何搭建MySQL主从结构&#xff1b; 原理 主从复制原理如下&#xff1a; &#xff08;1&#xff09;master数据写入&#xff0c;更新binlog&#xff1b; &#xff08;2&#xff09;master创建一个dump线程向slave推送binlog&#xff1b; &#xff…

小瓶清洗桶抗酸碱耐高温PFA清洗器半导体实验清洗用

PFA清洗桶&#xff0c;也叫PFA清洗器、PFA小瓶清洗桶&#xff0c;主要用于清洗浸泡实验室小型PFA溶样罐和烧杯等&#xff0c;带有密封螺纹盖&#xff0c;可以用于摇晃&#xff0c;高纯耐高温材质可放置电热板上加热使用。 特点&#xff1a;可拆卸倒酸口&#xff0c;可安全倒出酸…

网络安全是否有需求

● 由于网络威胁数量不断增加&#xff0c;网络安全的需求很高。 ● 组织正在大力投资网络安全以保护其数据。 ● 就业市场缺乏熟练的网络安全专业人员。 ● 网络安全认证可以提升您在网络安全领域的职业前景。 ● 持续学习并了解最新的安全趋势在该领域至关重要。 随着对技术和…

如何优雅地Spring事务编程

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 在开发中&#xff0c;有时候我们需要对 Spring 事务的生命周期进行监控&#xff0c;比如在事务提交、回滚或挂起时触发特定的逻辑处理。那么如何实现这种定制化操作呢&am…

windows安装nssm并将jar打包为服务

一、nssm 下载地址 二、安装nssm服务 将下载的压缩包复制到安装目录进行解压&#xff0c;解压后有两个版本 win32 和 win64&#xff0c;根据系统选择。打开系统 powershell 命令窗口&#xff0c;进入安装目录指定版本目录&#xff0c;就可以使用nssm服务了。 # 安装服务&…

接口测试和Mock学习路线(中)

1.什么是 swagger Swagger 是一个用于生成、描述和调用 RESTful 接口的 WEB 服务。 通俗的来讲&#xff0c;Swagger 就是将项目中所有想要暴露的接口展现在页面上&#xff0c;并且可以进行接口调用和测试的服务。 现在大部分的项目都使用了 swagger&#xff0c;因为这样后端…

SV-7041T IP网络有源音箱 教室广播多媒体音箱(带本地扩音功能)教学广播音箱 办公室背景音乐广播音箱 2.0声道壁挂式网络有源音箱

SV-7041T IP网络有源音箱 教室广播多媒体音箱&#xff08;带本地扩音功能&#xff09; 教学广播音箱 办公室背景音乐广播音箱 一、描述 SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带…

汇编期末复习知识点

参考文献1 第一章 概述 组成 计算机系统由硬件子系统和软件子系统组成。硬件子系统&#xff1a;组成计算机系统的所有电子的&#xff0c;机械的&#xff0c;光学的和磁性的元部件。 计算机中常用进制数表示 十进制(Decimal):数据尾部加一后缀D&#xff0c;如2355D二进制&a…

TFTLCD时序介绍(ILI9341 8080并口时序)

ILI9341 8080并口 ILI9341是一个常见的TFT LCD显示控制器&#xff0c;用于驱动各种小型和中型尺寸的液晶显示屏。它支持多种分辨率&#xff0c;最常见的是240x320像素。ILI9341控制器具有内置的GRAM&#xff08;Graphics RAM&#xff09;&#xff0c;可以通过SPI或8位并行接口…

初学python,怎样入门?

答案&#xff1a;乌龟绘图。 "乌龟绘图"通常指的是使用Logo语言的变种——Python中的turtle模块来进行图形绘制。在turtle模块中&#xff0c;一只名为“海龟”&#xff08;Turtle&#xff09;的小动物会在屏幕上移动&#xff0c;根据其行进路径来绘制图形。以下是一段…

百面算法工程师 | 激活函数 Activate Function

目录 10.1激活函数作用&#xff1a; 10.2 为什么激活函数都是非线性的 10.3 常见激活函数的优缺点及其取值范围 10.4 激活函数问题的汇总 10.4.1 Sigmoid的缺点&#xff0c;以及如何解决 10.4.2 ReLU在零点可导吗&#xff0c;如何进行反向传播 10.4.3 Softmax溢出怎么处…

如何解决非法采砂、过度开采的乱象?

非法采砂和过度开采是当今世界面临的重要环境问题之一。这些行为不仅破坏了生态平衡&#xff0c;还对河道安全、水资源保护等产生了严重影响。然而&#xff0c;经过多年的努力&#xff0c;河道采砂管理工作不断加强&#xff0c;全国采砂秩序总体可控。为了更有效地解决这一问题…

linux开发板开机启动向日葵

硬件&#xff1a;orangepi 5 pro 操作系统&#xff1a;ubuntu 20.4 lts 安装向日葵 根据我的实测&#xff0c;arm架构的ubuntu系统只能安装向日葵提供的麒麟系统的那个版本&#xff0c;具体安装方式官网下载页面有 允许任意用户连接到 X11 使用root用户登录后打开终端输入一下…

图形界面挂了?教你如何纯命令行下快速安装CentOS 7

在某些特定的系统或软件环境下&#xff0c;如使用 Parallels Desktop 18&#xff08;PD18&#xff09;虚拟化软件安装较老版本的操作系统&#xff08;如 CentOS 7&#xff09;&#xff0c;可能会遇到只能通过命令行进行安装的情况。这通常是由于内核版本与图形安装器的兼容性问…

docker系列7:docker安装ES

目录 传送门 Docker安装ES 确定版本 拉取镜像 执行拉取ES镜像 查看ES镜像 运行ES 创建一个新的docker网络 启动一个Elasticsearch容器 查看运行结果 ES启动内存不足 访问ES 公网访问 传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜…

血的教训之虚拟机重装[包含一系列虚拟机,c++,python,miniob配置]

一切都要从头开始&#xff0c;由于脑袋糊涂&#xff0c;没看到是虚拟机的文件&#xff0c;直接一口气全删掉了&#xff0c;哎&#xff01;&#xff01;数据恢复后发现也不行&#xff0c;磁盘文件还是缺失了一部分&#xff0c;只能重新再来了。 等待ing 看不到按钮&#xff0c;按…

前端CSS基础8(盒子模型(margin、border、padding、content))

前端CSS基础8&#xff08;盒子模型&#xff08;margin、border、padding、content&#xff09;&#xff09; CSS盒子模型CSS中常用的长度单位元素的分类&#xff0c;各个元素的显示模式修改元素的显示模式&#xff08;类型&#xff09;盒子模型的组成部分盒子内容区-contentCSS…

验证线缆(汽车线束、网线、多芯线)破损或断开与正常线缆的区别在哪里?依AEM CV-100 k50测试仪

工厂产线生产的线缆&#xff08;汽车线束、网线、多芯线&#xff09;做成成品&#xff0c;即2端都安装好了模块。在这种情况下如何快速的判定此条线缆是合格的呢&#xff0c;此处的合格为物理层面上的合格&#xff08;不会出现开路、短路&#xff09;&#xff0c;也就是最基本保…

Ansible自动化运维工具主机清单配置

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月24日12点21分 Ansible主机清单文件用于定义要管理的主机及其相关信息。它是Ansible的核心配置文件之一&#xff0c;用于Ansible识别目标主机并与其建立连接。 …

Leetcode_相交链表

✨✨所属专栏&#xff1a;LeetCode刷题专栏✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 题目&#xff1a; 题解&#xff1a; 看到这个题目首先我们要排除链表逆置的想法&#xff0c;如图、因为c1节点只有一个next指针&#xff0c;逆置后不可能同时指向a2和b3节点。 其次有的的同学…