【Qt】:常用控件(一)

常用控件

一.概述

Widget是Qt中的核⼼概念.英⽂原义是"⼩部件",我们此处也把它翻译为"控件".控件是构成⼀个图形化界⾯的基本要素。

像上述⽰例中的,按钮,列表视图,树形视图,单⾏输⼊框,多⾏输⼊框,滚动条,下拉框等,都可以称为"控件".

Qt作为⼀个成熟的GUI开发框架,内置了⼤量的常⽤控件.这⼀点在QtDesigner中就可以看到端倪.并且Qt也提供了"⾃定义控件"的能⼒,可以让程序猿在现有控件不能满⾜需求的时候,对现有控件做出扩展,或者⼿搓出新的控件.

二.QWidget核心属性

在Qt中,使⽤QWidget类表⽰"控件".像按钮,视图,输⼊框,滚动条等具体的控件类,都是继承⾃QWidget.可以说,QWidget中就包含了Qt整个控件体系中,通⽤的部分.

在Qt Designer中,随便拖⼀个控件过来,选中该控件,即可在右下⽅看到QWidget中的属性。

1.enabled(是否可用)

  1. 所谓"禁⽤"指的是该控件不能接收任何⽤⼾的输⼊事件,并且外观上往往是灰⾊的.
  2. 如果⼀个widget被禁⽤,则该widget的⼦元素也被禁⽤.

代码示例:设置一个禁用按钮

2.geometry(设置坐标)

位置和尺⼨.其实是四个属性的统称:

x 横坐标

y 纵坐标

width 宽度

height ⾼度

但是实际开发中,我们并不会直接使⽤这⼏个属性,⽽是通过⼀系列封装的⽅法来获取/修改:

对于Qt的坐标系,不要忘记是⼀个"左⼿坐标系".其中坐标系的原点是当前元素的⽗元素的左上⻆.

代码示例:控制按钮的位置

设置4个方向按钮,点击方向按钮来控制目标按钮的移动。

但当前的代码只是改变了目标按钮左上角的位置,与此同时高度和宽度也发生了变化。实际上实现了按钮大小的变化,如果我们想要按钮进行平移呢?其实很简单,用第二个函数,保持高度,宽度不变。

windowframe的影响

如果widget作为⼀个窗⼝(带有标题栏,最⼩化,最⼤化,关闭按钮),那么在计算尺⼨和坐标的时候就有两种算法.包含windowframe和不包含windowframe.其中x(),y(),frameGeometry(),pos(),move()都是按照包含windowframe的⽅式来计算的.

其中geometry(),width(),height(),rect(),size()则是按照不包含windowframe的⽅式来计算的.

当然,如果⼀个不是作为窗⼝的widget,上述两类⽅式得到的结果是⼀致的

3.WindTitle(窗口标题)

注意!上述设置操作针对不同的widget可能会有不同的⾏为.如果是顶层widget(独⽴窗⼝),这个操作才会有效.如果是⼦widget,这个操作⽆任何效果.

代码是咧:设置窗口标题

4.windowIcon

1.绝对路径

同windowTitle,上述操作仅针对顶层widget有效.

注意:QIcon对象尽量在栈上创建。

  1. 之前推荐使用堆来创建对象,主要是因为要确保当前的控件的生命周期是足够的.要通过Qt对象树来释放对象.
  2. Qlcon自身是一个比较小的对象.创建出来之后,就是要设置到某个QWidget里面.Qlcon对象本身释放不释放,不影响图标最终的显示.
  3. Qlcon也不支持对象树.无法给他执行父对象.

注意:Windows下路径的分隔符可以使⽤ / 也可以使⽤ \ .但是如果在字符串中使⽤ \ ,需要写作转义字符的形式 \ .因此我们还是更推荐使⽤ / .

可以看到我们使用的是绝对路径,这是很不好的,接下来把它改成相对路径。

那么路径=基准路径+相对路径。

假设基准路径为D盘,相对路径./image/rose.jpg。那么就先在D盘里找到image目录,再找到对应图片。

2.qrc机制

但实际上如果用户把该图片删除了,怎么办呢?对此Qt提供了一种更好的方式---qrc机制。

1.创建一个.drc文件



2.把图片导入qrc文件

先创建一个"前缀"。所谓的"前缀"可以理解成虚拟的目录。这个目录没有在你的电脑上真实存在,是Qt自己抽象出来的。qrc机制本质上就是把图片的二进制数据,转成C++代码.(最终就会在代码中看到很大的char数组,里面就是图片的二进制数据)。为了方便Qt代码中访问到这个图片,Qt就自己抽象出了虚拟的目录~~

接着就可以导入图片了。但是注意导入图片的时候,需要确保你导入的图片必须在resource.qrc 文件的同级目录,或者同级目录中的子目录里。也就是必须在点开的目录或者其子目录里。



5.windowOpacity(透明度)

代码⽰例:调整窗⼝透明度

创建两个按钮,一个按钮增加透明度,一个按钮减少透明度。

相关推荐
Swift社区3 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht3 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht3 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20243 小时前
Swift 数组
开发语言
Python私教3 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
stm 学习ing4 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc5 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe6 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin6 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python