四、常用控件
属性 | 作用 |
enabled | 设置控件是否可使用.true 表⽰可用,false 表示禁用 |
geometry | 位置和尺寸,包含x,y,width,height四个部分 其中坐标是以⽗元素为参考进行设置的. |
windowTitle | 设置widget标题 |
windowIcon | 设置widget图标 |
windowOpacity | 设置widget透明度 |
cursor | 鼠标悬停时显示的图标形状, 是普通箭头,还是沙漏,还是十字等形状, 在Qt Designer界面中可以清楚看到可选项. |
font | 字体相关属性 涉及到字体家族,字体大小,粗体,斜体,下划线等等样式 |
toolTip | 鼠标悬停在widget上会在状态栏中显示的提示信息. |
toolTipDuring | toolTip显示的持续时间. |
statusTip | Widget状态发生改变时显示的提示信息(比如按钮被按下等) |
whatsThis | 鼠标悬停并按下lt+F1时,显示的帮助信息(显示在一个弹出的窗口中) |
styleSheet | 允许使用CSS来设置widget中的样式. Qt中支持的样式非常丰富,对于前端开发人员上手是非常友好的. |
focusPolicy | 该widget如何获取到焦点. Qt:NoFocus:控件不参与焦点管理,即无法通过键盘或鼠标获取焦点 Qt:TabFocus:控件可以通过Tab键获得焦点 Qt:ClickFocus:控件可以通过鼠标点击获得焦点 Qt:StrongFocus:控件可以通过键盘和鼠标获得焦点 Qt:WheelFocus:控件可以通过鼠标滚轮获得焦点(在某些平台或样式中可能不可用) |
contextMenuPolicy | 上下文菜单的显示策略 Qt:DefaultContextMenu:默认的上下文菜单策略,用户可以通过鼠标右键或键盘快捷键触发上下文菜单 Qt:NoContextMenu:禁用上下文菜单,即使用户点击鼠标右键也不会显示菜单 Qt:PreventContextMenu:防止控件显示上下文菜单,即使用户点击鼠标右键也不会显示菜单 Qt:ActionsContextMenu:将上下文菜单替换为控件的“动作”菜单,用户可以通过鼠标右键或键盘快捷键触发这个菜单 Qt:CustomContextMenu:使用自定义的上下文菜单,用户可以通过鼠标右键或键盘快捷键触发这个菜单 |
locale | 设置语言和国家地区. |
acceptDrops | 该部件是否接受拖放操作。 如果设置为true,那么该部件就可以接收来自其他部件的拖放操作。当一个部件被拖放到该部件上时,该部件会接收到相应的拖放事件(如dropEvent) 如果设置为false,那么该部件将不会接收任何拖放操作。 |
minimumSize | 控件的最小尺寸.包含最小宽度和最小高度. |
maximumSize | 控件的最大尺寸.包含最大宽度和最大高度. |
sizePolicy | 尺寸策略.设置控件在布局管理器中的缩放方式. |
windowModality | 指定窗口是否具有"模态"行为. |
sizeIncrement | 拖动窗口大小时的增量单位. |
baseSize | 窗口的基础大小,用来搭配sizelncrement调整组件尺寸是计算组件应该调整到的合适的值. |
palette | 调色板.可以设置widget的颜色风格 |
mouseTracking | 是否要跟踪鼠标移动事件 如果设为true,表示需要跟踪,则鼠标划过的时候该widget就能持续收到鼠标移动事件, 如果设为false,表示不需要跟踪,则鼠标划过的时候widget不会收到鼠标移动事件,只能收到鼠标按下或者释放的事件, |
tabletTracking | 是否跟踪触摸屏的移动事件 类似于mouseTracking.Qt5.9中引入的新属性. |
layoutDirection | 布局方向 Qt:LeftToRight:文本从左到右排列,也是默认值。 Qt:RightToLeft:文本从右到左排列。 Qt:GlobalAtomics:部件的布局方向由全局原子性决定(PS这个翻译其实有点尴尬.其实就是根据应用程序中的其他widget布局方向确定的). |
autoFillBackground | 是否自动填充背景颜色. |
windowFilePath | 能够把widget和一个本地文件路径关联起来.PS:其实作用不大 |
accessibleName | 设置wⅵdgt的可访问名称.这个名称可以被辅助技术(像屏幕阅读器)获取到,这个属性用于实现无障碍程序的场景中(也就是给盲人写的程序) PS:其实盲人也是可以使用电脑和手机的.甚至盲人还能成为程序猿,参见我采访了几位盲人程序员,看看他们是怎么写代码的【差评君】_哔哩哔哩_bilibili |
accessibleDescripti on | 设置widget的详细描述.作用同accessibleName |
inputMethodHints | 针对输入框有效,用来提示用户当前能输入的合法数据的格式.比如只能输入数字,只能输入日期等. |
1.QWidget
①enabled 可用状态属性
描述了一个控件是都处于可用状态
所谓禁用指的是该控件不能接受任何用户的输入事件,并且外观上往往是灰色的,如果一个widget被禁用,则该widget的子元素也被禁用
API | 说明 |
isEnabled | 获取到控件的可用状态 |
setEnabled | 设置控件是否可使用,true表示可用,false表示禁用 |
无法点击,是灰色
用一个按钮控制另一个按钮是否可用
在同一个界面中,要求不同的控件的objectName必须是不同的,后续就可以通过ui->objectName
方式来获取到对应的控件对象了
ui->pushButton
得到第一个按钮
ui->pushButton_2
得到第二个按钮
元编程qt会根据ui文件,生成一个ui_widget.h
文件,生成的过程中就会感知到,界面上都有哪些控件,每个控件的objectName
自动生成的objectName
都有规律,根据控件类型+下划线+数字,这种命名方式不是好的习惯,可以自己在属性栏编辑一下
点击另一个按钮,上边这个就被禁用了(变成灰色)
②geometry
位置和尺寸属性
位置和尺寸,其实是四个属性的统称:
×
横坐标
y
纵坐标
width
宽度
height
高度
但是实际开发中,我们并不会直接使用这几个属性,而是通过⼀系列封装的方法来获取/修改
API | 说明(Rect->矩形) |
geometry() | 获取到控件的位置和尺寸.返回结果是一个QRect,包含了X,y,width,height.其中X,y是左上角的坐标. |
setGeometry(QRect) setGeometry(int x, int y, int width, int height) | 设置控件的位置和尺寸.可以直接设置一个QRct,也可以分四个属性单独设置, |
第一个函数属性,实现按钮大小变化
第二个函数属性,实现按钮位置变化
void Widget::on_pushButton_clicked()
{ui->label->setText("kiss");
}// 点击松开后移动
void Widget::on_pushButton_2_clicked()
{// // 移动按钮到随机位置// // 获取当前程序窗口位置// int width = this->geometry().width();// int height = this->geometry().height();// // 确保新得到的坐标在窗口内部,用余数得到的x一定<width// // rand函数使用前要设置随机种子// int x = rand() % width;// int y = rand() % height;// ui->label->setText("你再考虑考虑吧");// ui->pushButton_2->move(x,y);
}// 点击按下就会移动
void Widget::on_pushButton_2_pressed()
{// 移动按钮到随机位置// 获取当前程序窗口位置int width = this->geometry().width();int height = this->geometry().height();// 确保新得到的坐标在窗口内部,用余数得到的x一定<width// rand函数使用前要设置随机种子int x = rand() % width;int y = rand() % height;ui->label->setText("你再考虑考虑吧");ui->pushButton_2->move(x,y);
}
③windowframe对计算窗口的影响
如果widget作为一个窗口(带有标题栏,最小化,最大化,关闭按钮),那么在计算尺寸和坐标的时候就有两种算法.包含window frame
和不包含window frame
其中x() ,y() ,frameGeometry() ,pos() ,move() 都是按照包含window frame的方式来计算的.
其中geometry() ,width(), height(), rect(), size()则是按照不包含window frame的方式来计算的.
当然,如果一个不是作为窗口的widget,上述两类方式得到的结果是一致的,
API | 说明 |
x() | 获取横坐标 计算时包含window frame |
y() | 获取纵坐标 计算时包含window frame |
pos() | 返回QPoint对象,里面包含x(), y(), setX(), setY()等方法 计算时包含window frame |
frameSize() | 返回QSize对象,里面包含width(), height(), setWidth(), setHeight() 等方法 计算时包含window frame |
frameGeometry() | 返回QRect对象,QRect相当于QPoint和QSize的结合体,可以获取x(), y(), width(), size() 计算时包含window frame对象 |
width() | 获取宽度 计算时不包含window frame |
height() | 获取高度 计算时不包含window frame |
size() | 返回QSize对象,里面包含 width(), height(), setWidth(), setHeight()等方法计算时不包含windowframe |
rect() | 返回QRect对象,QRect相当于QPoint和QSize的结合体,可以获取并设置x, y, width, size 计算时不包含windowframe |
geometry() | 返回QRect对象,QRect相当于QPoint和QSize的结合体,可以获取x, y, width, size 计算时不包含windowframe |
setGeometry() | 直接设置窗口的位置和尺寸,可以设置x, y, width, height,或者QRect 对象. 计算时不包含window frame对象 |
这段代码在构造函数中,此时Widget对象还在构造,还未在WindowFrame中,所以两个结果一样
geometry
比framegeometry
要小一些
④windowTitle 顶层窗口标题
只针对顶层窗口能进行使用
API | 说明 |
windowTitle() | 获取到控件的窗口标题 |
setWindowTitle(const QString& title) | 设置控件的窗口标题 |
⑤windowIcon 顶层窗口图标
只针对顶层窗口能进行使用
API | 说明 |
windowIcon | 获取到控件的窗口图标,返回QIcon对象 |
setWindowIcon(const QIcon& icon) | 设置控件的窗口图标 |
QIcon自身是一个比较小的对象
创建出来以后,就会设置到某个QWidget中,QIcon对象本事释放不释放,不影响图标最终的显示,QIcon也不支持对象树,无法给他执行父对象,所以创建在栈上就可以
上述的绝对路径,只能在本机使用,如果别人的环境运行,会找不到该路径下的文件,所以最好使用相对路径,但是相对路径也可能文件发生转移而找不到
qrc机制解决了这个问题:
给Qt项目引入一个额外的xml文件,后缀名用.qrc
表示,在这个xml中把要使用的图片的资源给导入进来,并且在xml中进行记录
在Qt编译项目时,就会根据qrc中描述的图片信息,找到图片内容,并提取出图片的二进制数据,把这些二进制数据转换成C++代码,最终编译到.exe
中
缺点就是无法导入太大的资源文件
qrc使用方式:
qrc文件,不能带中文和特殊符号
在项目中创建一个qrc文件
添加图片文件的时候,需要确保导入的图片必须在resource.qrc
的同级目录或者同级目录的子目录里
导入成功
⑥windowOpacity 透明度变化
API | 说明 |
windowOpacity() | 获取到控件的不透明值,返回float,取值为 0.0->1.0 ,其中 0.0表示全透明,1.0 表示完全不透明 |
setwindowOpacity(float n) | 设置控件不透明值 |
用按钮控制透明度变化
终端可以看到,每次变化并不是精确的0.1,这跟浮点数在内存中的存储方式有关,浮点数存储时按照 IEEE 754标准,规定了浮点数要使用二进制科学计数法的方式表示,一个浮点数分为了三部分:符号位,有效数字,指数部分。
使用二进制表示的有效数字,有效数字是指小于0的小数部分(默认整数部分是 1 )
例如101
:第一个有效数字位表示0.5
,第二个有效数字位表示0.25
,第三个有效数字位表示0.125
,所以101
表示0.625
由于float和double有效数字长度有限,所以无法凑出一个非常接近0.1
这样的数字,很多主流编程语言都是这套体系,优点:运算速度快,占用空间小,缺点:对于有些小数无法精确表示
编写代码中,不能把两个浮点数使用 == 进行比较
比如 0.1 + 0.2 == 0.3
这种是错误的,所以用浮点数的时候要慎用
if(opacity <= 0.0){return;}
这段也可以不写,超过 1.0 是添加不进去的,但是最好写上,涉及到防御性编程,别人犯了错,不会对自身构成太大伤害,是一个比较好的习惯,在代码大全中,推荐双重判定
⑦cursor 光标的形状
API | 说明 |
cursor() | 获取到当前widget的cursor属性,返回QCursor对象 |
setCursor(const QCursor& cursor) | 设置widget光标的形状,仅在鼠标停留在该widget上时生效 |
QGUIAPPlication::setOverrideCursor(const QCursor& cursor) | 设置全局光标的形状,对整个程序中的所有widget都会生效,覆盖上面的setCursor设置的内容 |
.ui
实现:
代码实现:
自定义光标
先准备一个图片,把图导入到项目中(qrc管理)
在代码中访问到这个图片,基于这个图片构造出光标对象并设置~~
添加图片文件的时候,需要确保导入的图片必须在resource.qrc
的同级目录或者同级目录的子目录里,上图的路径为错误路径,详情看Icon中的设置方式
QPixmap通过这个就能访问到图片
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//访问到图片文件QPixmap pixmap(":/1.jpg");// 用函数对图片进行缩放,不是修改图像本身,结果会返回一个图片所以需要再次赋值给pixmappixmap = pixmap.scaled(100,100);//热点位置,以左上角为原点,设置10,10的位置是实际点击位置QCursor cursor(pixmap,10,10);//把光标设置进去this->setCursor(cursor);
}Widget::~Widget()
{delete ui;
}
系统内置的光标形状如下:
Ctrl+左键点击Qt:WaitCursor
跳转到源码即可看到.
enum CursorShape{ArrowCursor,UpArrowCursor,Crosscursor,WaitCursor,IBeamCursor,SizeVerCursor,SizeHorCursor,SizeBDiagCursor,SizeFDiagCursor,SizeAllCursor,BlankCursor,SplitVCursor,SplitHCursor,PointingHandCursor,ForbiddenCursor,WhatsThisCursor,BusyCursor,OpenHandCursor,ClosedHandCursor,DragCopyCursor,DragMoveCursor,DragLinkCursor,LastCursor DragLinkCursor,BitmapCursor = 24,CustomCursor = 25
}
图标库:iconfont-阿里巴巴矢量图标库
⑧font 字体属性信息
API | 说明 |
font() | 获取当前widget的字体信息,返回QFont对象 |
setFont(const QFont& font) | 设置当前widget的字体信息 |
关于QFont
字体信息
属性 | 说明 |
family | 字体家族.比如"楷体”,"宋体”,"微软雅黑"等 |
pointSize | 字体大小 |
weight | 字体粗细.以数值方式表示粗细程度取值范围为[0,99],数值越大,越粗 |
bold | 是否加粗.设置为true,相当于weight为75.设置为false相当于weight为50. |
italic | 是否倾斜 |
underline | 是否带有下划线 |
strikeOut | 是否带有删除线 |
⑨toolTip 鼠标悬停提示说明
API | 说明 |
setToolTip | 设置toolTip 鼠标选停在该widget上时会有提示说明 |
setToolTipDuring | 设置toolTip提示的时间,单位ms 时间到后toolTip自动消失 |
toolTip只是给用户看的.在代码中一般不需要获取到toolTip.
⑩focusPolicy 获取到焦点
设置控件获取到焦点的策略,比如某个控件能否用鼠标选中或者能否通过tab键选中
所谓"焦点”,指的就是能选中这个元素.接下来的操作(比如键盘操作),就都是针对该焦点元素进行的了这个对于输入框,单选框,复选框等控件非常有用的
这个事情就和War3或者sc2中,先选中单位,再下达命令是一样的.
API | 说明 |
focusPolicy() | 获取该widget的focusPolicy,返回Qt:FocusPolicy |
setFocusPolicy(Qt::FocusPolicy policy) | 设置widget的focusPolicy |
Qt::FocusPolicy
是一个枚举类型.取值如下
Qt::NoFocus
:控件不会接收键盘焦点Qt::TabFocus
:控件可以通过Tab键接收焦点Qt::ClickFocus
:控件在鼠标点击时接收焦点Qt::StrongFocus
:控件可以通过Tab键和鼠标点击接收焦点(默认值)Qt::WheelFocus
:类似于Qt::StrongFocus,同时控件也通过鼠标滚轮获取到焦点(新增的选项,一般很少使用)
⑪styleSheet 样式属性(css)
CSS(Cascading Style Sheets层叠样式表)本身属于网页前端技术.主要就是用来描述界面的样式
所谓"样式”,包括不限于大小,位置,颜色,间距,字体,背景,边框等.
我们平时看到的丰富多彩的网页,就都会用到大量的CSS.
Qt虽然是做GUI开发,但实际上和网页前端有很多异曲同工之处.因此Qt也引入了对于CSS的支持.
CSS中可以设置的样式属性非常多.基于这些属性Qt只能支持其中一部分,称为QSS(Qt Style Sheet)
具体的支持情况可以参考Qt文档中"Qt Style Sheets Reference"章节.
QSS设置样式也是键值对格式,键和值之间用冒号隔开,每两个样式之间用;
分隔
Qt文档:Qt Style Sheet
注意单词拼写,拼写出错不会有任何报错,但是样式不会生效