Qt常用控件(二)
🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Qt的学习】
📝📝本篇内容:window frame;windowTitle;windowIcon
⬆⬆⬆⬆上一篇:Qt练习小程序(无法拒绝的按钮)
💖💖作者简介:轩情吖,请多多指教(>> •̀֊•́ ) ̖́-
1.window frame
在我们之前的使用geometry的时候,并没有去关注过窗口的尺寸具体指的是哪一部分,是包含标题栏那一行以及其他三边框呢还是不包含。
其实这个用专业的叫法是window frame即窗口框架,这是操作系统自带的内容
因此Qt中也提供了不同的API来供尺寸和大小使用
函数声明 | 函数功能 |
---|---|
frameGeometry | 返回值是QRect类型,计算时包含 window frame |
geometry | 返回值是QRect类型,计算时不包含window frame |
我们可以写一份代码来看看它们的不同之处
我们可以发现再构造函数里面怎么是一模一样的,而且x和y都是0呢?而到了后面按钮的槽函数中就正常了
这主要是因为代码是在构造函数中,我们的Widget还没有完全创建好,还在构造,还没有被添加到window frame中,看不到window frame带来的影响,因此就会出现这种情况。但是一旦出了构造函数,比如我们按钮在槽函数中打印的内容,它就没问题了,因为此时我们的窗口已经完全构造好了
我们可以稍微浅浅的看一下带window frame和不带的区别,首先是x它们之间差了1是因为我们的左侧边框,而y差了那么多的原因是因为标题栏占的位子大。而它的尺寸也是差不多道理,宽度width是因为左右两边的边框各占1像素所以说是2,而高度height是由于标题栏的原因就会大很多。并且window frame比起单纯的窗口会占更大空间,因此在位置上,window frame会比单纯的窗口坐标位置更小,而在尺寸上会更大。
2.windowTitle
这个属性肯定非常熟悉了,就是窗口标题,但是有个注意事项,就是这个属性来自于QWidget,
设置的时候如果是顶层 widget (独⽴窗⼝), 这个操作才会有效,其余的子widget,这个操作则没有任何效果。
简单来说就是只有窗口widget可以来设置属性,其余的像按钮啊这些控件,虽然都是多多少少继承于QWidget,但都是子控件,所以它们设置时,不会有任何效果。见下面代码演示
从理论上来讲,不应该给按钮这样的功能来设置标题,虽然设置后没有任何的报错和效果,但是这样的设定其实是不太合理的。
3.windowIcon
接下来要将的是windowIcon,这个其实指的是程序的图标,如下展示,它分别在任务栏或程序界面上显示
我们默认的图标就如上图一样,没有任何的观赏性,也没有任何的含义
因此Qt也给我们提供了这方面的API
函数声明 | 函数功能 |
---|---|
QIcon windowIcon() const | 获取到控件的窗⼝图标,返回 QIcon 对象 |
void setWindowIcon(const QIcon &icon) | 设置控件的窗⼝图标 |
同样的,对于windowIcon而言,
仅仅是对顶层widget有效
接下来代码演示
先在想要的路径下保存一张图片,记住它的位置和名字
代码非常简单,功能也实现了,但是有几个问题
首先肯定是有同学会疑惑,为什么这里不使用堆上开辟呢,而是直接使用栈帧上的呢?
在我们之前之所以使用动态开辟是因为我们要保证我们的控件有足够的生命周期并且加入对象树中在合适的时候释放内存,但是QIcon本身是一个比较小的对象,创建后并且已经设置进Widget窗口内部,因此无论释放不释放,都不会影响最后的显示
。并且QIcon不支持对象树,无法将它挂到父对象下。
接下来要讲的是路径,首先就是不能带中文,其次我们在演示中使用的是正斜杠\,但是如果想要使用反斜杠\就要注意了,它在C/C++中代表的是转义字符,因此使用时需要使用双反斜杠
但是这样写还是会有问题,那就是这个路径是绝对路径,作为开发者,你无法做不到保证用户的路径也是这样,万一用户是只有一个C盘呢?还有一个情况,那就是万一用户不小心把这张图片给删了怎么办呢?
因此我们使用相对路径会比绝对路径更好,相对路径是以给定的路径为基准,以.和…开头。但是这种方法依旧解决不了用户把图片搞丢的情况,因此Qt中还提供了qrc机制
这个机制可以解决两个问题:
防止用户把图片给不小心搞丢
确保用户的机器上有图标的路径
因此要使用这个机制就需要在项目中创建一个新的xml文件(.qrc后缀),在xml文件中,将图片的数据导入进来,并且在xml中记录下来,Qt在编译项目的时候,就会根据qrc中描述的图片信息,找出图片内容,再提取出图片的二进制数据,把这些二进制数据转成C++代码,最后一起编译到exe可执行文件中。但是qrc对于很大的文件无法导入,比如几个G的视频文件
接下来讲一下怎么创建qrc文件
文件名可以不带后缀,系统会自动添加为.qrc
创建完文件后,我们就是上图这样的一个界面,接下来就是需要先创建一个虚拟目录,所谓的虚拟目录就是在电脑上不存在的,是Qt抽象出来的,这主要是为了方便Qt去访问图标
接下来就可以使用Add Files来添加图标了,找到我们的图片
我们添加的文件就是在之前的prefix前缀路径下的,但是发现报错了,说是路径有问题。
这其实我们的图片文件在qt路径下,但是实际上我们需要保证我们的图标是在.qrc文件的同一目录下或者是同一目录下的子目录下才可以
因此将图标移动到当前项目的路径下即可
当界面是这样就说明成功了,这个时候我们就可以使用刚刚的前缀+文件名来设置图标了
当代码中需要访问qrc管理的文件时就需要在路径前面加上:
接下来我们就又可以去Qt自动生成的代码中瞧一瞧,有没有什么变化没有
在当前文件夹中倒是什么都发现,但是debug文件中似乎多了一个.cpp结尾的qrc文件,这个就是生成的C++文件
打开后可以发现一个char类型的数组,它其实每一个字节都是图标里每一个字节的数据
总结:qrc机制将图片的二进制数据转换成C++代码,C++代码中就会有一个很大的char类型数组,其中的每一个字节就是图标的二进制转换而来的,当Qt编译项目的时候,就会将这个.cpp文件一起编译到.exe文件中,当exe运行时,这个图标也就被加载到了内存中。通过这种方式即解决了图标路径不一致的问题,也保护了图标的存在性。
🌸🌸Qt常用控件之QWidget(二)大概就讲到这里啦,博主后续会继续更新更多Qt的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!如有小伙伴需要Qt的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪