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");
    // 用函数对图片进行缩放,不是修改图像本身,结果会返回一个图片所以需要再次赋值给pixmap
    pixmap = 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

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

相关推荐

  1. qt有哪些

    2024-07-17 05:54:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 05:54:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 05:54:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 05:54:03       57 阅读
  4. Python语言-面向对象

    2024-07-17 05:54:03       68 阅读

热门阅读

  1. Go 语言中的互斥锁 Mutex

    2024-07-17 05:54:03       22 阅读
  2. k8s入门:从安装到实际应用

    2024-07-17 05:54:03       29 阅读
  3. ajax实时监测与springboot的实例分析

    2024-07-17 05:54:03       24 阅读
  4. 计算机网络入门 --网络模型

    2024-07-17 05:54:03       24 阅读
  5. 【Qt+opencv】计时函数与图像变换

    2024-07-17 05:54:03       26 阅读
  6. 简谈设计模式之适配器模式

    2024-07-17 05:54:03       24 阅读
  7. PR轨道蒙版|字体后放视频动画

    2024-07-17 05:54:03       24 阅读
  8. try-catch-finally使用注意事项

    2024-07-17 05:54:03       19 阅读
  9. IPython的数学魅力:%%latex命令绘制公式指南

    2024-07-17 05:54:03       24 阅读
  10. 采购管理软件:改善初创企业的采购流程

    2024-07-17 05:54:03       25 阅读
  11. 机体坐标系和导航坐标系

    2024-07-17 05:54:03       26 阅读
  12. 前后端工作重点小结

    2024-07-17 05:54:03       22 阅读
  13. WPF设置欢迎屏幕,程序启动过度动画

    2024-07-17 05:54:03       19 阅读