C++客户端Qt开发——常用控件QWidget

四、常用控件

属性

作用

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中,所以两个结果一样

geometryframegeometry要小一些

④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

注意单词拼写,拼写出错不会有任何报错,但是样式不会生效

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32 IDE】使用STM32CubeIDE创建一个工程

关于IDE的下载安装和环境配置这里暂且不介绍&#xff0c;我们直接使用STM32F407ZGT6创建工程。 这里需要注意两点&#xff1a; 创建工程时&#xff0c;默认使用最新版本的固件包&#xff08;HAL库&#xff09;&#xff0c;好像还不让更改。如果本地电脑位置没有该版本的包&…

注意力机制中三种掩码技术详解和Pytorch实现

注意力机制是许多最先进神经网络架构的基本组成部分&#xff0c;比如Transformer模型。注意力机制中的一个关键方面是掩码&#xff0c;它有助于控制信息流&#xff0c;并确保模型适当地处理序列。 在这篇文章中&#xff0c;我们将探索在注意力机制中使用的各种类型的掩码&…

【瑞吉外卖 | day07】移动端菜品展示、购物车、下单

文章目录 瑞吉外卖 — day71. 导入用户地址簿相关功能代码1.1 需求分析1.2 数据模型1.3 代码开发 2. 菜品展示2.1 需求分析2.2 代码开发 3. 购物车3.1 需求分析3.2 数据模型3.3 代码开发 4. 下单4.1 需求分析4.2 数据模型4.3 代码开发 瑞吉外卖 — day7 移动端相关业务功能 —…

MySQL 一行记录是怎么存储的

文章目录 1. 文件存放目录 && 组织2. 表空间文件的结构3. InnoDB 行格式4. Compact 行格式记录的额外信息1. 变长字段长度列表2. NULL 值列表3. 记录头信息 记录的真实数据1. 定义的表字段2. 三个隐藏字段 5. varchar(n) 中 n 最大取值为多少&#xff1f;6. 行溢出后&a…

pnpm install安装失败

ERR_PNPM_META_FETCH_FAIL GET https://registry.npmjs.org/commitlint%2Fcli: request to https://registry.npmjs.org/commitlint%2Fcli failed, reason: connect ETIMEDOUT 2606:4700::6810:123:443 1. 检查网络连接 确保你的网络连接正常并且没有被防火墙或代理服务器阻止…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(二)——带着问题的学习;一刷感受;环境搭建

按照作者在读者寄语中的说法&#xff1a;我们得榨干这本书的知识。 带着问题 为了更好的学习&#xff0c;我们最好带着问题去探索。 第一&#xff1a;核心问题与基础知识 如上图&#xff1a;这本书介绍了SLAM相关的核心问题和基础知识。王谷博士给我们做了梳理&#xff1a;…

数据结构(4.1)——树的性质

结点数总度数1 结点的度——结点有几个孩子(分支) 度为m的树、m叉树的区别 度为m的树第i层至多有 个结点(i>1) 高度为h的m叉树至多有 个结点 高度为h的m叉树至少有h个结点 、高度为h&#xff0c;度为m叉树至多有hm-1个结点 具有n个结点的m叉树的最小高度为 总结

数据采集监控平台:挖掘数据价值 高效高速生产!

在当今数字化的时代&#xff0c;数据已成为企业非常宝贵的资产之一。然而&#xff0c;要充分发挥数据的潜力&#xff0c;离不开一个强大的数据采集监控平台&#xff0c;尤其是生产制造行业。它不仅是数据的收集者&#xff0c;更是洞察生产的智慧之眼&#xff0c;高效高速处理产…

EXCEL VBA工程密码破解 工作表保护破解

这里写目录标题 破解Excel宏工程加密方法一 新建破解宏文件方法二 修改二进制文件 破解工作表保护引用 破解Excel宏工程加密 如图所示 白料数据处理已工程被加密。 方法一 新建破解宏文件 1 创建一个XLSM文件&#xff0c;查看代码 ALTF11 2 新建一个模块&#xff0c;“插…

云计算数据中心(二)

目录 三、绿色节能技术&#xff08;一&#xff09;配电系统节能技术&#xff08;二&#xff09;空调系统节能技术&#xff08;三&#xff09;集装箱数据中心节能技术&#xff08;四&#xff09;数据中心节能策略和算法研究&#xff08;五&#xff09;新能源的应用&#xff08;六…

新版本 idea 创建不了 spring boot 2 【没有jkd8选项】

创建新项目 将地址换成如下 https://start.aliyun.com/

Calibration相机内参数标定

1.环境依赖 本算法采用张正友相机标定法进行实现&#xff0c;内部对其进行了封装。 环境依赖为 ubuntu20.04 opencv4.2.0 yaml-cpp yaml-cpp安装方式&#xff1a; &#xff08;1&#xff09;git clone https://github.com/jbeder/yaml-cpp.git #将yaml-cpp下载至本地 &a…

深度解析:disableHostCheck: true引发的安全迷局与解决之道

在Web开发的浩瀚星空中&#xff0c;开发者们时常会遇到各种配置与调优的挑战&#xff0c;其中disableHostCheck: true这一选项&#xff0c;在提升开发效率的同时&#xff0c;也悄然埋下了安全隐患的伏笔。本文将深入探讨这一配置背后的原理、为何会引发报错&#xff0c;以及如何…

深度学习落地实战:基于GAN(生成对抗网络)生成图片

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

Qt会议室项目

在Qt中编写会议室应用程序通常涉及到用户界面设计、网络通信、音频/视频处理等方面。以下是创建一个基本会议室应用程序的步骤概述&#xff1a; 项目设置&#xff1a; 使用Qt Creator创建一个新的Qt Widgets Application或Qt Quick Application项目。 用户界面设计&#xff1…

牛客TOP101:合并k个已排序的链表

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 多个链表的合并本质上可以看成两个链表的合并&#xff0c;只不过需要进行多次。最简单的方法就是一个一个链表&#xff0c;按照合并两个有序链表的思路&#xff0c;循环多次就可以了。   另外一个思路&a…

(c++)virtual关键字的作用,多态的原理(详细)

1.viirtual修饰的两种函数 virtual 修饰的函数有两种&#xff0c;一个是虚函数&#xff0c;一个是纯虚函数。 2.虚函数与纯虚函数的异同之处 1.虚函数与纯虚函数的相同之处 虚函数和纯虚函数都重写的一种&#xff0c;什么是重写呢&#xff1f;重写是指在子类中写和父类中返…

《0基础》学习Python——第十四讲__封装、继承、多态

<封装、继承、多态> 一、类和实例解析 1、面向对象最重要的概念就是类&#xff08;Class&#xff09;和实例&#xff08;Instance&#xff09;&#xff0c;必须牢记类是抽象的模板 &#xff0c;比如Student类&#xff0c;而 实例是根据类创建出来的一个个具体的“对象”…

《昇思25天学习打卡营第23天|onereal》

第23天学习内容简介&#xff1a; ----------------------------------------------------------------------------- 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 1 环境配置 配置网络线路 2 代码开发 下载权重大约需要10分钟 ------------------------------- 运…

大模型技术对学校有什么作用?

大模型技术对学校有多方面的作用&#xff0c;可以在教学、管理、决策等多个领域带来显著的改进。以下是大模型技术对学校的主要作用&#xff1a; 1. 个性化教学&#xff1a;大模型技术可以帮助教师分析学生的学习行为和历史成绩&#xff0c;从而定制个性化的教学计划和资源。这…