QT常见显示类控件及其属性
Label
QLabel可用用来显示文本和图片
核心属性如下
文本格式---textFormat
例:
在ui界面创建3个label,分别用不同的显示格式
在构造函数进行文本格式和文内容设置
此时运行后三种显示格式无区别
可以给富文本加标签
如<B>表示加粗
如果将<B>加到纯文本格式的文本内容中,只会被当作纯文本处理
在markdown格式的文本中加#将文本作为一级标题
如果在纯文本格式加入#也只会当中文本处理
pixmap
用于给标签添加图片
如:
创建一个label
创建资源文件
用qrc机制将准备好的图片导入资源文件
将label设置的和窗口一样大,用于显示图片
800,600
接收图片并设置进label
但是图片和窗口并不完全嵌合,需要对图片大小进行调整
通过scaledContents,启动图片自动拉伸让其进行调整
使图片自动嵌合
但是此时若是对widget窗口进行调整,就会使widget大小改变,而在构造函数中将widget大小设置进label是一次性的,一旦程序运行起来后,窗口发生变化时,label的大小是不会改变的,从而使label中的图片和窗口不嵌合
如何进行调整使label一直嵌合窗口,随窗口大小改变而发生改变呢?
利用事件---用户的操作分为两种,一种是信号,一种是事件
鼠标拖拽修改窗口大小的时候,就是一种事件----resize事件(resizeEvect)
像resize这样的事件是连续变化的,把窗口尺寸从A大小拖到B大小的过程中,会触发一系列的resizeEvent
此时就可以借助resizeEvent来修改label大小
通过让widget窗口类重写父类(QWidget)的resizeEvent虚函数(多态)
在鼠标拖动窗口修改窗口大小时,不断触发resizeEvent事件,不断对label大小进行修改,从而实现label的大小一直和窗口嵌合
测试:
选中函数名按alt+enter进行定义
在触发resizeEvent事件时打印窗口大小信息
进行拖拽修改窗口大小的测试,查看输出内容
每次拖拽修改大小都会触发事件,打印信息
实现修改尺寸:
实现实时修改label大小,因为对图片设置了自动拉伸,所有label大小改变图片也会自动适应
alignment
文本对齐和自动换行
例:
先给label带上边框便于观察
选中label后将其framefshape的属性改为box,使label带边框
创建四个label给他们设置不同的对齐方式
在构造函数中进行设置
wordWrap
自动换行
例如:
设置自动换行
indent
文本缩进
设置文本缩进后,不只是首行进行缩进,其余行也会缩进
margin
文本边距-----文本框内四个方向的边框,使文本只能在四边边距内显示
Buddy
Qlabel关联伙伴关系,点击QLabel激活关联其伙伴
如:
创建两个radiobutton
创建两个label
label内容中&A,&B表示添加快捷键,可通过alt+a,alt+b触发快捷键
Qt中Qlabel中写的文本,是可以指定快捷键的,通过&跟上一个字符表示快捷键,通过alt+字符来触发快捷键
在构造函数设置伙伴关系
可以通过点击选项或者alt+a,alt+b进行选中label,从而触发其绑定的伙伴
LCD Number
QLCDNumer是一个专门用来显示数字的控件,类似于老实计算机的效果
核心属性
例:
实现一个用QLCDNumber的倒计时
在ui界面创建一个LCDNumber
在构造函数处进行初始化
实现每秒钟值减一------QTimer
通过这个类创建的对象,会产生一个timeout信号,可以通过statrt的方式来开启定时器,并在参数中设定timeout信号的触发周期,结合connect将timeout信号绑定到label的槽函数中,通过结合timeout信号好槽函数来实现lable值每秒减一
在头文件中声明槽函数,定义成员变量
定义槽函数,看是否能正常是否信号
在槽函数中实现LCDNumber中的数字减一
不使用QTimer,而采用在构造函数处进行循环修改LCDNumber数值实现倒计时
发现等待一段时间后widget窗户才弹出,并且lcdnumber值为0
因为循环是在widget构造函数处实现,需将构造函数执行完毕后才能进行widget窗口显示,所以widget窗口出来时,循环已经结束,值变为0
如果用一个线程实现构造函数,一个线程实现循环能实现倒计时吗?
窗口未生成,出现异常
因为Qt中,界面是由一个专门的线程负责维护与更新(主线程)
对于GUI来说,Qt为了保证修改界面过程中,线程安全不受影响,禁止主线程之外的线程直接修改页面
槽函数默认是主线程调用
ProgressBar
QProgressBar表示一个进度条
核心属性
例:
实现简单的自动增长的进度条
创建一个progress bar
设置初始值
在头文件声明槽函数和timer
给progressBar进行初始化,创建QTimer对象,连接信号和槽函数,启动timer
定义槽函数
styleSheet
自定义进度条样式
在ui界面找到progressBar的sytleSheet属性
进行自定义
QProgressBar::chunk是选择器,表示选中progressBar和其中的chunk(进度条)
但是此时当前进度数字位置发生改变,通过alignment进行修改,使其居中对齐
此时是将QTimer的头文件包含到widget.h中,若将QTimer头文件包含到widget.cpp中仍然能正常使用QTimer
但在widget.h文件中用到了QTimer,但没包含QTimer头文件,为什么不会报错?
Qt内部提供专门的头文件,包含了Qt中所有类的前置声明,但是若要真正使用相关头文件内容,还是需要进行头文件的包含
为什么提供类的前置声明?
提高编译速度,通过前置声明的方式减少头文件的包含
Calendar Widget
QCalendarWidget表示一个日历
如:
核心属性:
重要信号
例:
在ui界面创建calendarwidget
转到它的selectionChangde信号的槽函数
定义槽函数后,点击日期就会输出对应日期信息
再在ui界面创建一个label,用于打印当前选中的日期信息