QT常用控件

常用控件

  • 控件概述
  • QWidget 核⼼属性
    • 核⼼属性概览
    • enabled
    • geometry
    • windowTitle
    • windowIcon
    • windowOpacity
    • cursor
    • font
    • toolTip
    • focusPolicy
    • styleSheet
  • 按钮类控件
    • Push Button
    • Radio Buttion
    • Check Box
  • 显⽰类控件
    • Label
    • LCD Number
    • ProgressBar
    • Calendar Widget
  • 输⼊类控件
    • Line Edit
    • Text Edit
    • Combo Box
    • Spin Box
    • Date Edit & Time Edit
    • Dial
    • Slider
  • 多元素控件
    • List Widget
    • Table Widget
    • Tree Widget
  • 容器类控件
    • Group Box
    • Tab Widget
  • 布局管理器
    • 垂直布局
    • ⽔平布局
    • ⽹格布局
    • 表单布局
    • Spacer

控件概述

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

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

在这里插入图片描述

QWidget 核⼼属性

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

在 Qt Designer 中, 随便拖⼀个控件过来, 选中该控件, 即可在右下⽅看到 QWidget 中的属性
在这里插入图片描述

这些属性既可以通过 QtDesigner 会直接修改, 也可以通过代码的⽅式修改.
这些属性的具体含义, 在 Qt Assistant 中均有详细介绍.

核⼼属性概览

下列表格列出了 QWidget 中的属性及其作⽤.

属性作⽤
enabled设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤.
geometry位置和尺⼨. 包含 x, y, width, height 四个部分.其中坐标是以⽗元素为参考进⾏设置的.
windowTitle设置 widget 标题
windowIcon设置 widget 图标
windowOpacity设置 widget 透明度
cursor⿏标悬停时显⽰的图标形状.是普通箭头, 还是沙漏, 还是⼗字等形状.在 Qt Designer 界⾯中可以清楚看到可选项.
font字体相关属性.涉及到字体家族, 字体⼤⼩, 粗体, 斜体, 下划线等等样式.
toolTip⿏标悬停在 widget 上会在状态栏中显⽰的提⽰信息.
toolTipDuringtoolTip 显⽰的持续时间.
statusTipWidget 状态发⽣改变时显⽰的提⽰信息(⽐如按钮被按下等).
whatsThis⿏标悬停并按下 alt+F1 时, 显⽰的帮助信息(显⽰在⼀个弹出的窗⼝中).
styleSheet允许使⽤ CSS 来设置 widget 中的样式.Qt 中⽀持的样式⾮常丰富, 对于前端开发⼈员上⼿是⾮常友好的.

enabled

API说明
isEnabled()获取到控件的可⽤状态.
setEnabled设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤.

代码⽰例: 使⽤代码创建⼀个禁⽤状态的按钮
在这里插入图片描述
代码⽰例: 通过按钮2 切换按钮1 的禁⽤状态.

  1. 使⽤ Qt Designer 拖两个按钮到 Widget 中.
    在这里插入图片描述
    两个按钮的 objectName 分别为 pushButton 和 pushButton_2

  2. ⽣成两个按钮的 slot 函数.
    使⽤ isEnabled 获取当前按钮的可⽤状态.
    使⽤ setEnabled 修改按钮的可⽤状态. 此处是直接针对原来的可⽤状态进⾏取反后设置.
    在这里插入图片描述
    运⾏程序, 可以看到, 初始情况下, 上⾯的按钮是可⽤状态.
    点击下⽅按钮, 即可使上⽅按钮被禁⽤; 再次点击下⽅按钮, 上⽅按钮就会解除禁⽤. (禁⽤状态的按钮为灰⾊, 且不可点击).
    在这里插入图片描述

geometry

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

  • x 横坐标
  • y 纵坐标
  • width 宽度
  • height ⾼度

在这里插入图片描述

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

API说明
geometry()获取到控件的位置和尺⼨. 返回结果是⼀个 QRect, 包含了 x, y, width, height. 其中 x, y 是左上⻆的坐标.
setGeometry(QRect);setGeometry(int x, int y, int width, int height)设置控件的位置和尺⼨. 可以直接设置⼀个 QRect, 也可以分四个属性单独设置.

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

  1. 在界⾯中拖五个按钮.
    五个按钮的 objectName 分别为 pushButton_target , pushButton_up ,
    pushButton_down , pushButton_left , pushButton_right五个按钮的初始位置和⼤⼩都随意.
    在这里插入图片描述

  2. 在 widget.cpp 中编写四个按钮的 slot 函数
    在这里插入图片描述
    运⾏程序, 可以看到, 按下下⽅的四个按钮, 就会控制 target 的左上⻆的位置. 对应的按钮整个尺⼨也会发⽣改变.

上述代码中我们是直接设置的 QRect 中的 x, y . 实际上 QRect 内部是存储了左上和右下两个点的坐标, 再通过这两个点的坐标差值计算⻓宽.
单纯修改左上坐标就会引起整个矩形的⻓宽发⽣改变.
在这里插入图片描述
如果想让整个按钮都移动, 可以改成下列代码:
在这里插入图片描述

代码⽰例: ⼀个表⽩程序

  1. 往界⾯上拖拽两个按钮和⼀个 Label.
    Label 的 objectName 为 pushButton_accept 和 pushButton_reject , label 的objectName 为 label
    控件中⽂本如下图所⽰
    在这里插入图片描述

  2. 在 widget.cpp 中添加 slot 函数.
    在这里插入图片描述
    运⾏程序, 可以看到, 当点击 “NO” 时, 按钮就跑了
    在这里插入图片描述
    上述代码使⽤的是 pressed, ⿏标按下事件. 如果使⽤ mouseMoveEvent, 会更狠⼀些, 只要⿏标移动过来, 按钮就跑了.
    对应的代码更⿇烦⼀些 (需要⾃定义类继承⾃ QPushButton, 重写 mouseMoveEvent ⽅法). 此处暂时不展开.

window frame 的影响
如果 widget 作为⼀个窗⼝ (带有标题栏, 最⼩化, 最⼤化, 关闭按钮), 那么在计算尺⼨和坐标的时候就有两种算法. 包含 window frame 和 不包含 window frame.
其中 x(), y(), frameGeometry(), pos(), move() 都是按照包含 window frame 的⽅式来计算的.
其中 geometry(), width(), height(), rect(), size() 则是按照不包含 window frame 的⽅式来计算的.
当然, 如果⼀个不是作为窗⼝的 widget , 上述两类⽅式得到的结果是⼀的.

在这里插入图片描述
相关 API

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() 等⽅法.计算时不包含 window frame
rect()返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取并设置 x,y, width, size.计算时不包含 window frame 对象.
geometry()返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取 x,y,width, size.计算时不包含 window frame 对象.
setGeometry()直接设置窗⼝的位置和尺⼨. 可以设置 x, y, width, height, 或者 QRect 对象.计算时不包含 window frame 对象.

代码⽰例: 感受 geometry 和 frameGeometry 的区别.

  1. 在界⾯上放置⼀个按钮.
    在这里插入图片描述

  2. 在按钮的 slot 函数中, 编写代码
    在这里插入图片描述

  3. 在构造函数中, 也添加同样的代码
    在这里插入图片描述

执⾏程序, 可以看到, 构造函数中, 打印出的 geometry 和 frameGeometry 是相同的.
但是在点击按钮时, 打印的 geometry 和 frameGeometry 则存在差异.
在这里插入图片描述

windowTitle

API说明
windowTitle()获取到控件的窗⼝标题.
setWindowTitle(const QString& title)设置控件的窗⼝标题.

代码⽰例: 设置窗⼝标题
在这里插入图片描述
执⾏效果
在这里插入图片描述

windowIcon

API说明
windowIcon()获取到控件的窗⼝图标. 返回 QIcon 对象.
setWindowIcon(constQIcon& icon)设置控件的窗⼝图标.

代码⽰例: 设置窗⼝图标

  1. 先在 F 盘中放⼀个图⽚, 名字为 rose.jpg
    在这里插入图片描述

  2. 修改 widget.cpp
    在这里插入图片描述

  3. 运⾏程序, 可以看到窗⼝图标已经成为上述图⽚;于此同时, 程序在任务栏中的图表也发⽣改变
    在这里插入图片描述

对于 Qt 程序来说, 当前⼯作⽬录可能是变化的. ⽐如通过 Qt Creator 运⾏的程序, 当前⼯作⽬录是项⽬的构建⽬录; 直接双击 exe 运⾏, ⼯作⽬录则是 exe 所在⽬录.
所谓构建⽬录, 是和 Qt 项⽬并列的, 专⻔⽤来放⽣成的临时⽂件和最终 exe 的⽬录.
在这里插入图片描述

代码⽰例: 获取当前的⼯作⽬录

  1. 在界⾯上创建⼀个⽐较⼤的 label, 确保能把路径显⽰完整. objectName 使⽤默认的 label 即可
    在这里插入图片描述

  2. 修改 widget.cpp
    使⽤ QDir::currentPath() 即可获取到当前⼯作⽬录
    在这里插入图片描述

  3. 直接在 Qt Creator 中执⾏程序, 可以看到当前⼯作⽬录是项⽬的构建⽬录.
    在这里插入图片描述

Qt 使⽤ qrc 机制帮我们⾃动完成了上述⼯作, 更⽅便的来管理项⽬依赖的静态资源.
代码⽰例: 通过 qrc 管理图⽚作为图标

  1. 右键项⽬, 创建⼀个 Qt Resource File (qrc ⽂件), ⽂件名随意起(不要带中⽂), 此处叫做resource.qrc .
    在这里插入图片描述

  2. 在 qrc 编辑器中, 添加前缀.
    在这里插入图片描述
    此处我们前缀设置成 / 即可.(所谓的前缀, 可以理解成 “⽬录” . 这个前缀决定了后续我们如何在代码中访问资源)

  3. 在 资源编辑器 中, 点击 add Files 添加资源⽂件. 此处我们需要添加的是 myimg.jpg
    在这里插入图片描述
    添加的⽂件必须是在 qrc ⽂件的同级⽬录, 或者同级⽬录的⼦⽬录中. 因此我们需要把之前 F 盘中的 myimg.jpg 复制到上述⽬录中.

  4. 在代码中使⽤ myimg.jpg
    编辑 widget.cpp
    在这里插入图片描述
    注意上述路径的访问规则.
    使⽤ : 作为开头, 表⽰从 qrc 中读取资源.
    / 是上⾯配置的前缀
    myimg.jpg 是资源的名称
    需要确保代码中编写的路径和添加到 qrc 中资源的路径匹配. 否则资源⽆法被访问

  5. 运⾏程序, 可以看到图标已经能正确设置
    在这里插入图片描述

windowOpacity

API说明
windowOpacity()获取到控件的不透明数值. 返回 float, 取值为 0.0 -> 1.0 其中 0.0 表⽰全透明, 1.0 表⽰完全不透明.
setWindowOpacity(float n)设置控件的不透明数值.

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

  1. 在界⾯上拖放两个按钮, 分别⽤来增加不透明度和减少不透明度.
    objectName 分别为 pushButton_add 和 pushButton_sub
    在这里插入图片描述

  2. 编写 wdiget.cpp, 编写两个按钮的 slot 函数
    点击 pushButton_sub 会减少不透明度, 也就是窗⼝越来越透明
    点击 pushButton_add 会增加不透明度, 窗⼝会逐渐恢复
    在这里插入图片描述

  3. 执⾏程序, 可以看到, 点击了⼏下 - 之后, 就可以透过窗⼝看到后⾯的代码. 点击 + ⼜会逐渐恢复.
    在这里插入图片描述
    同时控制台中也可以看到 opacity 数值的变化
    在这里插入图片描述

cursor

API说明
cursor()获取到当前 widget 的 cursor 属性, 返回 QCursor 对象.当⿏标悬停在该 widget 上时, 就会显⽰出对应的形状.
setCursor(const QCursor& cursor)设置该 widget 光标的形状. 仅在⿏标停留在该 widget 上时⽣效.
QGuiApplication::setOverrideCursor(const QCursor& cursor设置全局光标的形状. 对整个程序中的所有 widget 都会⽣效. 覆盖上⾯的 setCursor 设置的内容.

代码⽰例: 在 Qt Designer 中设置按钮的光标

  1. 在界⾯中创建⼀个按钮
    在这里插入图片描述

  2. 直接在右侧属性编辑区修改 cursor 属性为 “打开”
    在这里插入图片描述

  3. 运⾏程序, ⿏标悬停到按钮上, 即可看到光标的变化.

代码⽰例: 通过代码设置按钮的光标

  1. 编写 widget.cpp
    其中 Qt::OpenHandCursor 就是⾃带的打开形状的光标.在这里插入图片描述
    系统内置的光标形状如下:
    在这里插入图片描述

  2. 运⾏程序, 观察效果.

代码⽰例: ⾃定义⿏标光标
Qt ⾃带的光标形状有限. 我们也可以⾃⼰找个图⽚, 做成⿏标的光标
在这里插入图片描述

  1. 创建 qrc 资源⽂件, 添加前缀 / , 并加⼊ myimg.jpg
    在这里插入图片描述

  2. 编写 widget.cpp
    在这里插入图片描述

  3. 运⾏程序, 观察效果

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是否带有删除线

代码⽰例: 在 Qt Designer 中设置字体属性

  1. 在界⾯上创建⼀个 label
    在这里插入图片描述

  2. 在右侧的属性编辑区, 设置该 label 的 font 相关属性
    在这里插入图片描述

  3. 执⾏程序, 观察效果
    在这里插入图片描述

代码⽰例: 在代码中设置字体属性

  1. 在界⾯中创建 label, objectName 使⽤默认的 label 即可
    在这里插入图片描述

  2. 修改 widget.cpp
    在这里插入图片描述

  3. 运⾏程序, 观察效果
    在这里插入图片描述

toolTip

API说明
setToolTip设置 toolTip.⿏标悬停在该 widget 上时会有提⽰说明.
setToolTipDuring设置 toolTip 提⽰的时间. 单位 ms.时间到后 toolTip ⾃动消失.

代码⽰例: 设置按钮的 toolTip

  1. 在界⾯上拖放两个按钮. objectName 设置为 pushButton_yes 和 pushButton_no
    在这里插入图片描述

  2. 编写 widget.cpp
    在这里插入图片描述

  3. 运⾏程序, 观察效果
    可以看到⿏标停到按钮上之后, 就能弹出提⽰. 时间到后⾃⾏消失
    在这里插入图片描述

focusPolicy

设置控件获取到焦点的策略. ⽐如某个控件能否⽤⿏标选中或者能否通过 tab 键选中.
所谓 “焦点” , 指的就是能选中这个元素. 接下来的操作 (⽐如键盘操作), 就都是针对该焦点元素进⾏的
了. 这个对于 输⼊框, 单选框, 复选框等控件⾮常有⽤的.

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 , 同时控件也通过⿏标滚轮获取到焦点 (新增的选项, ⼀般很少使⽤)

代码⽰例: 理解不同的 focusPolicy

  1. 在界⾯上创建四个单⾏输⼊框 (Line Edit)
    在这里插入图片描述

  2. 修改四个输⼊框的 focusPolicy 属性为 Qt::StrongFocus (默认取值, ⼀般不⽤额外修改)
    在这里插入图片描述
    此时运⾏程序, 可以看到, 使⽤⿏标单击/tab, 就可以移动光标所在输⼊框. 从⽽接下来的输⼊就是针对这个获取焦点的输⼊框展开的了.
    在这里插入图片描述

  3. 修改第⼆个输⼊框的 focusPolicy 为 Qt::NoFocus , 则第⼆个输⼊框不会被 tab / ⿏标左键选中.
    在这里插入图片描述
    此时这个输⼊框也就⽆法输⼊内容了.
    在这里插入图片描述

  4. 修改第⼆个输⼊框 focusPolicy 为 Qt::TabFocus , 则只能通过 tab 选中, ⽆法通过⿏标选中.
    在这里插入图片描述
    在这里插入图片描述

  5. 修改第⼆个输⼊框 focusPolicy 为 Qt::ClickFocus , 则只能通过⿏标选中, ⽆法通过tab选中.
    在这里插入图片描述

styleSheet

通过 CSS 设置 widget 的样式
CSS 中可以设置的样式属性⾮常多. 基于这些属性 Qt 只能⽀持其中⼀部分, 称为 QSS (Qt Style Sheet)

具体的⽀持情况可以参考 Qt ⽂档中 “Qt Style Sheets Reference” 章节.
此处只是进⾏⼀个简单的演⽰.

代码⽰例: 设置⽂本样式

  1. 在界⾯上创建 label
    在这里插入图片描述

  2. 编辑右侧的 styleSheet 属性, 设置样式
    在这里插入图片描述
    此处的语法格式同 CSS, 使⽤键值对的⽅式设置样式. 其中键和值之间使⽤ : 分割. 键值对之间使⽤; 分割.
    编辑完成样式之后, 可以看到在 Qt Designer 中能够实时预览出效果.
    在这里插入图片描述

  3. 运⾏程序, 可以看到实际效果和预览效果基本⼀致.

代码⽰例: 实现切换夜间模式.

  1. 在界⾯上创建⼀个多⾏输⼊框 (Text Edit) 和两个按钮
    objectName 分别为 pushButton_light 和 pushButton_dark
    在这里插入图片描述

  2. 编写按钮的 slot 函数
    #333 是深⾊;#fff 是纯⽩⾊;#000 是纯⿊⾊
    在这里插入图片描述

  3. 运⾏程序, 点击 “⽇间模式”, 就是浅⾊背景, 深⾊⽂字; 点击 “夜间模式”, 就是深⾊背景, 浅⾊⽂字
    在这里插入图片描述

按钮类控件

Push Button

使⽤ QPushButton 表⽰⼀个按钮. 这也是当前我们最熟悉的⼀个控件了.
QPushButton 继承⾃ QAbstractButton . 这个类是⼀个抽象类. 是其他按钮的⽗类.

在这里插入图片描述
在 Qt Designer 中也能够看到这⾥的继承关系.
在这里插入图片描述
QAbstractButton 中, 和 QPushButton 相关性较⼤的属性

属性说明
text按钮中的⽂本
icon按钮中的图标
iconSize按钮中图标的尺⼨
shortCut按钮对应的快捷键
autoRepeat按钮是否会重复触发. 当⿏标左键按住不放时,如果设为 true, 则会持续产⽣⿏标点击事件;如果设为 false, 则必须释放⿏标, 再次按下⿏标时才能产⽣点击事件.(相当于游戏⼿柄上的 “连发” 效果)
autoRepeatDelay重复触发的延时时间. 按住按钮多久之后, 开始重复触发.
autoRepeatInterval重复触发的周期

代码⽰例: 带有图标的按钮

  1. 创建 resource.qrc ⽂件, 并导⼊图⽚
    在这里插入图片描述

  2. 在界⾯上创建⼀个 按钮
    在这里插入图片描述

  3. 修改 widget.cpp, 给按钮设置图标
    在这里插入图片描述

  4. 执⾏程序, 观察效果
    在这里插入图片描述

代码⽰例: 带有快捷键的按钮

  1. 在界⾯中拖五个按钮.
    五个按钮的初始位置随意, 其中 pushButton_target 尺⼨设置为 100 * 100, 其余按钮设为 50 *50. ⽂本内容均清空
    在这里插入图片描述
  2. 创建 resource.qrc , 并导⼊ 5 个图⽚.

在这里插入图片描述

  1. 修改 widget.cpp, 设置图标资源和快捷键
    使⽤ setShortcut 给按钮设置快捷键. 参数是⼀个 QKeySequence 对象. 表⽰⼀个按键序列. ⽀持组合键
    QKeySequence 的构造函数参数, 可以直接使⽤ “ctrl+c” 这样的按键名字符串表⽰, 也可以使⽤预定义好的常量表⽰.
    在这里插入图片描述

  2. 修改 widget.cpp, 设置四个⽅向键的 slot 函数
    在这里插入图片描述

  3. 运⾏程序, 此时点击按钮, 或者使⽤ wasd 均可让猫咪移动.
    在这里插入图片描述

代码⽰例: 按钮的重复触发
在上述案例中, 按住快捷键, 是可以进⾏重复触发的. 但是⿏标点击则不能.
修改 widget.cpp, 在构造函数中开启重复触发
在这里插入图片描述
此时, 按住⿏标时, 即可让狗头连续移动.

Radio Buttion

QRadioButton 是单选按钮. 可以让我们在多个选项中选择⼀个.
QAbstractButton 中和 QRadioButton 关系较⼤的属性

属性说明
checkable是否能选中
checked是否已经被选中. checkable 是 checked 的前提条件
autoExclusive是否排他.选中⼀个按钮之后是否会取消其他按钮的选中.对于 QRadioButton 来说默认就是排他的.

代码⽰例: 选择性别

  1. 在界⾯上创建⼀个 label, 和 3 个 单选按钮
    设置的⽂本如下图. 3 个单选按钮的 objectName 分别为 radioButton_male ,radioButton_female , radioButton_other
    在这里插入图片描述

  2. 修改 widget.cpp, 编辑三个 QRadioButton 的 slot 函数.
    在这里插入图片描述

  3. 运⾏程序, 可以看到随着选择不同的单选按钮, label 中的提⽰⽂字就会随之变化.
    在这里插入图片描述

  4. 当前代码中, 如果程序启动, 则不会选择任何选项
    可以修改代码, 让程序启动默认选中性别男
    在这里插入图片描述

此时运⾏程序, 即可看到 性别男 已经被选中了.
在这里插入图片描述

  1. 当前代码中, 也可以禁⽤ “其他” 被选中
    修改 widget.cpp 的构造函数
    在这里插入图片描述
    运⾏程序, 可以看到, 点击 “其他” 按钮的时候, 虽然不会被选中, 但是可以触发点击事件, 使上⾯的 label显⽰性别为其他.
    在这里插入图片描述
    使⽤ setEnabled 是更彻底的禁⽤按钮的⽅式. 此时该按钮⽆法被选中, 也⽆法响应任何输⼊
    在这里插入图片描述

在这里插入图片描述

代码⽰例: click, press, release, toggled 的区别
clicked 表⽰⼀次 “点击”;pressed 表⽰⿏标 “按下”;released 表⽰⿏标 “释放”;toggled 表⽰按钮状态切换

  1. 在界⾯上创建四个单选按钮
    在这里插入图片描述

  2. 给 1 创建 clicked 槽函数, 给 2 创建 pressed 槽函数, 给 3 创建 released 槽函数,给 4 创建 toggled 槽函数.
    在这里插入图片描述

  3. 运⾏程序, 可以看到
    clicked 是⼀次⿏标按下+⿏标释放触发的.
    pressed 是⿏标按下触发的.
    released 是⿏标释放触发的
    toggled 是 checked 属性改变时触发的
    在这里插入图片描述

代码⽰例: 单选框分组

  1. 在界⾯上创建 6 个单选框, ⽤来模拟⻨当劳点餐界⾯.
    在这里插入图片描述
    此时直接运⾏程序, 可以看到, 这六个 QRadioButton 之间都是排他的.
    我们希望每⼀组内部来控制排他, 但是组和组之间不能排他

  2. 引⼊ QButtonGroup 进⾏分组
    修改 widget.cpp
    在这里插入图片描述
    再次执⾏程序, 可以看到可以按照正确的分组⽅式来完成排他了
    在这里插入图片描述

Check Box

QCheckBox 表⽰复选按钮. 可以允许选中多个.
和 QCheckBox 最相关的属性也是 checkable 和 checked , 都是继承⾃
QAbstractButton .

代码⽰例: 获取复选按钮的取值

  1. 在界⾯上创建 三个复选按钮, 和⼀个普通按钮
    在这里插入图片描述

  2. 给 pushButton 添加 slot 函数
    在这里插入图片描述

  3. 运⾏程序, 可以看到点击确认按钮时, 就会在控制台中输出选中的内容
    在这里插入图片描述

显⽰类控件

Label

QLabel 可以⽤来显⽰⽂本和图⽚

属性说明
textQLabel 中的⽂本
textFormat⽂本的格式.: Qt::PlainText 纯⽂本; Qt::RichText 富⽂本(⽀持 html 标签); Qt::MarkdownText markdown 格式•;Qt::AutoText 根据⽂本内容⾃动决定⽂本格式.
pixmapQLabel 内部包含的图⽚.

代码⽰例: 显⽰不同格式的⽂本

  1. 在界⾯上创建三个 QLabel
    在这里插入图片描述

  2. 修改 widget.cpp, 设置三个 label 的属性
    在这里插入图片描述

  3. 运⾏程序, 观察效果

代码⽰例: 显⽰图⽚

  1. 在界⾯上创建⼀个 QLabel, objectName 为 label
    在这里插入图片描述
  2. 创建 resource.qrc ⽂件, 并把图⽚导⼊到 qrc 中.

在这里插入图片描述

  1. 修改 widget.cpp, 给 QLabel 设置图⽚
    在这里插入图片描述
    执⾏程序, 观察效果
    在这里插入图片描述
    这个图⽚并没有把 QLabel 填充满.

  2. 修改代码, 设置 scaledContents 属性
    在这里插入图片描述
    再次运⾏, 观察效果, 可以看到图⽚已经被拉伸, 可以把窗⼝填满了.
    在这里插入图片描述

  3. 此时, 如果拖动窗⼝⼤⼩, 可以看到图⽚并不会随着窗⼝⼤⼩的改变⽽同步变化
    在这里插入图片描述
    为了解决这个问题, 可以在 Widget 中重写 resizeEvent 函数.
    在这里插入图片描述
    执⾏程序, 此时改变窗⼝⼤⼩, 图⽚也会随之变化.
    在这里插入图片描述
    于此同时, 在控制台⾥也能够看到尺⼨变化的过程.
    在这里插入图片描述

代码⽰例: ⽂本对⻬, ⾃动换⾏, 缩进, 边距

  1. 创建四个 label
    并且在 QFrame 中设置 frameShape 为 Box (设置边框之后看起来会更清晰⼀些)
    在这里插入图片描述
    在这里插入图片描述

  2. 编写 widget.cpp, 给这四个 label 设置属性
    在这里插入图片描述

  3. 运⾏程序, 可以看到如下效果
    第⼀个 label 垂直⽔平居中
    第⼆个 label 设置了 wordWrap, 能够⾃动换⾏
    第三个 label 设置了 Indent, 左侧和上⽅和边框有间距. 右侧则没有.
    第四个 label 设置了 margin, 四个⽅向均有间距
    在这里插入图片描述

代码⽰例: 设置伙伴

  1. 创建两个 label 和 两个 radioButton.
    在这里插入图片描述
    此处把 label 中的⽂本设置为 “快捷键 &A” 这样的形式.
    其中 & 后⾯跟着的字符, 就是快捷键.
    可以通过 alt + A 的⽅式来触发该快捷键.

  2. 编写 widget.cpp, 设置 buddy 属性
    在这里插入图片描述

  3. 运⾏程序, 可以看到, 按下快捷键 alt + a 或者 alt + b, 即可选中对应的选项
    在这里插入图片描述

LCD Number

QLCDNumer 是⼀个专⻔⽤来显⽰数字的控件. 类似于 “⽼式计算器” 的效果.
在这里插入图片描述

属性说明
intValueQLCDNumber 显⽰的数字值(int).
valueQLCDNumber 显⽰的数字值(double).和 intValue 是联动的.设置 value 和 intValue 的⽅法名字为 display
digitCount显⽰⼏位数字

代码⽰例: 倒计时

  1. 在界⾯上创建⼀个 QLCDNumber , 初始值设为 10.
    在这里插入图片描述

  2. 修改 widget.h 代码, 创建⼀个 QTimer 成员, 和⼀个 updateTime 函数
    在这里插入图片描述

  3. 修改 widget.cpp, 在构造函数中初始化 QTimer
    QTimer 表⽰定时器. 通过 start ⽅法启动定时器之后, 就会每隔⼀定周期, 触发⼀次QTimer::timeout 信号.
    使⽤ connect 把 QTimer::timeout 信号和 Widget::updateTime 连接起来, 意味着每次触发 QTimer::timeout 都会执⾏ Widget::updateTime
    在这里插入图片描述

  4. 修改 widget.cpp, 实现 updateTime
    通过 intValue 获取到 QLCDNumber 内部的数值.
    如果 value 的值归 0 了, 就停⽌ QTimer . 接下来 QTimer 也就不会触发 timeout 信号了.
    在这里插入图片描述

  5. 执⾏程序, 可以看到每隔⼀秒钟, 显⽰的数字就减少 1
    在这里插入图片描述

ProgressBar

使⽤ QProgressBar 表⽰⼀个进度条.
在这里插入图片描述

属性说明
minimum进度条最⼩值
maximum进度条最⼤值
value进度条当前值
alignment⽂本在进度条中的对⻬⽅式
textVisible进度条的数字是否可⻅

代码⽰例: 设置进度条按时间增⻓

  1. 在界⾯上创建进度条, objectName 为 progressBar
    在这里插入图片描述

  2. 修改 widget.h, 创建 QTimer 和 updateProgressBar 函数
    在这里插入图片描述

  3. 修改 widget.cpp, 初始化 QTimer
    此处设置 100ms 触发⼀次 timeout 信号. 也就是⼀秒钟触发 10 次
    在这里插入图片描述

  4. 修改 widget.cpp, 实现 updateProgressBar
    在这里插入图片描述

  5. 运⾏程序, 可以看到进度条中的进度在快速增⻓
    在这里插入图片描述

Calendar Widget

QCalendarWidget 表⽰⼀个 “⽇历”
在这里插入图片描述

属性说明
selectDate当前选中的⽇期
minimumDate最⼩⽇期
maximumDate最⼤⽇期
firstDayOfWeek每周的第⼀天(也就是⽇历的第⼀列)
gridVisible是否显⽰表格的边框
selectionMode是否允许选择⽇期
dateEditEnabled是否允许⽇期被编辑

重要信号

信号说明
selectionChanged(const QDate&)当选中的⽇期发⽣改变时发出
activated(const QDate&)当双击⼀个有效的⽇期或者按下回⻋键时发出,形参是⼀个QDate类型,保存了选中的⽇期
currentPageChanged(int,int)当年份⽉份改变时发出,形参表⽰改变后的新年份和⽉份

代码⽰例: 获取选中的⽇期

  1. 在界⾯上创建⼀个 QCalendarWidget 和 ⼀个 label
    在这里插入图片描述

  2. 给 QCalendarWidget 添加 slot 函数
    在这里插入图片描述

  3. 执⾏程序, 可以看到当选择不同的⽇期时, label 中的内容就会随之改变.
    在这里插入图片描述

输⼊类控件

Line Edit

QLineEdit ⽤来表⽰单⾏输⼊框. 可以输⼊⼀段⽂本, 但是不能换⾏.

属性说明
text输⼊框中的⽂本
inputMask输⼊内容格式约束
maxLength最⼤⻓度
frame是否添加边框
echoMode显⽰⽅式
cursorPosition光标所在位置
alignment⽂字对⻬⽅式, 设置⽔平和垂直⽅向的对⻬
dragEnabled是否允许拖拽
readOnly是否是只读的(不允许修改)

核⼼信号

属性说明
void cursorPositionChanged(int old, int new)当⿏标移动时发出此信号,old为先前的位置,new为新位置
void editingFinished()当按返回或者回⻋键时,或者⾏编辑失去焦点时,发出此信号
void returnPressed()当返回或回⻋键按下时发出此信号.如果设置了验证器, 必须要验证通过, 才能触发.
void selectionChanged()当选中的⽂本改变时,发出此信号
void textChanged(const QString &text)当QLineEdit中的⽂本改变时,发出此信号,text是新的⽂本。代码对⽂本的修改能够触发这个信号
void textEdited(const QString &text))当QLineEdit中的⽂本改变时,发出此信号,text是新的⽂本。代码对⽂本的修改不能触发这个信号

代码⽰例: 录⼊个⼈信息

  1. 在界⾯上创建三个输⼊框和两个单选按钮, ⼀个普通按钮
    在这里插入图片描述

  2. 编写 widget.cpp, 在构造函数中编写初始化代码
    在这里插入图片描述

  3. 继续修改 widget.cpp, 给按钮添加 slot 函数
    在这里插入图片描述

  4. 执⾏程序, 可以看到, 随着⽤⼾输⼊内容之后, 点击按钮, 就能打印到输⼊的信息
    在这里插入图片描述
    在这里插入图片描述

代码⽰例: 使⽤正则表达式验证输⼊框的数据
此处要求在输⼊框中输⼊⼀个合法的电话号码(1 开头, 11 位, 全都是数字). 如果验证不通过, 则确定按钮⽆法点击

  1. 在界⾯上创建输⼊框和⼀个按钮.
    在这里插入图片描述

  2. 编写 widget.cpp, 把按钮初始 enabled 设为 false. 给输⼊框添加验证器
    使⽤ QRegExp 创建⼀个正则表达式对象. “^1\d{10}$” 表⽰ “以 1 开头, 后⾯跟上任意的10个⼗进制数字”
    使⽤ QRegExpValidator 创建⼀个验证器对象. Qt 中内置了四个主要的验证器对象
    在这里插入图片描述
    在这里插入图片描述

  3. 编写 widget.cpp, 给 lineEdit 添加 textEdited 信号的 slot 函数
    on_lineEdit_textEdited 的参数是当前输⼊框的内容
    通过 lineEdit->validator() 获取到内置的验证器
    通过 validate ⽅法验证⽂本是否符合要求:第⼀个参数填写的是要验证的字符串. 由于参数要求是 QString& ⽽不是 const QString& , 需要把这个变量复制⼀下;第⼆个参数是⼀个 int&, 是输出型参数. 当验证的字符串不匹配时, 返回这个字符串的⻓度;返回值是⼀个枚举. QValidator::Acceptable 表⽰验证通过,QValidator::Invalid 表⽰验证不通过
    在这里插入图片描述

  4. 执⾏程序, 观察效果. 可以看到此时尝试输⼊字⺟是⽆法输⼊的. 并且只有当输⼊的内容符合要求, 确定按钮才能被使⽤
    在这里插入图片描述

代码⽰例: 验证两次输⼊的密码⼀致

  1. 在界⾯上创建两个输⼊框和⼀个 label
    在这里插入图片描述

  2. 编写代码, 设置两个输⼊框的 echoMode 为 Password
    在这里插入图片描述

  3. 给两个输⼊框设置 textEdited slot 函数
    在这里插入图片描述

  4. 执⾏程序, 观察效果
    可以看到当两个输⼊框内的密码不相同时, 就会提⽰密码不相同
    在这里插入图片描述

代码⽰例: 切换显⽰密码

  1. 创建⼀个输⼊框和⼀个复选按钮
    在这里插入图片描述

  2. 修改 widget.cpp, 设置输⼊框的 echoMode 为 Password
    在这里插入图片描述

  3. 修改 widget.cpp, 给 checkBox 添加 slot 函数
    在这里插入图片描述

  4. 执⾏程序, 可以看到切换复选框的状态, 就可以控制输⼊框显⽰密码
    在这里插入图片描述

Text Edit

QTextEdit 表⽰多⾏输⼊框. 也是⼀个富⽂本 & markdown 编辑器.
并且能在内容超出编辑框范围时⾃动提供滚动条

属性说明
markdown输⼊框内持有的内容. ⽀持 markdown 格式. 能够⾃动的对markdown ⽂本进⾏渲染成 html
html输⼊框内持有的内容. 可以⽀持⼤部分 html 标签. 包括 img 和 table 等.
placeHolderText输⼊框为空时提⽰的内容
readOnly是否是只读的

核⼼信号

信号说明
textChanged()⽂本内容改变时触发
selectionChanged()选中范围改变时触发
cursorPositionChanged()光标移动时触发
undoAvailable(bool)可以进⾏ undo 操作时触发
redoAvailable(bool)可以进⾏ redo 操作时触发
copyAvaiable(bool)⽂本被选中/取消选中时触发

代码⽰例: 获取多⾏输⼊框的内容

  1. 创建⼀个多⾏输⼊框和⼀个label
    在这里插入图片描述

  2. 给多⾏输⼊框添加 slot 函数. 处理 textChanged 信号
    通过 toPlainText ⽅法获取到内部的⽂本.
    在这里插入图片描述

  3. 执⾏程序, 可以看到当输⼊框中的内容发⽣变化时, label 中的内容同步发⽣改变
    在这里插入图片描述

代码⽰例: 验证输⼊框的各种信号

  1. 创建多⾏输⼊框
    在这里插入图片描述

  2. 给输⼊框添加以下⼏个 slot 函数
    QTextEdit 中包含了⼀个 QTextCursor 对象, 通过这个对象可以获取到当前光标位置和选中的内容.
    在这里插入图片描述

  3. 执⾏程序, 观察结果
    在这里插入图片描述

Combo Box

QComboBox 表⽰下拉框.

属性说明
currentText当前选中的⽂本
currentIndex当前选中的条⽬下标从 0 开始计算. 如果当前没有条⽬被选中, 值为 -1
editable是否允许修改;设为 true 时, QComboBox 的⾏为就⾮常接近 QLineEdit , 也可以设置 validator
iconSize下拉框图标 (⼩三⻆) 的⼤⼩
maxCount最多允许有多少个条⽬

核⼼⽅法

⽅法说明
addItem(const QString&)添加⼀个条⽬
currentIndex()获取当前条⽬的下标;从 0 开始计算. 如果当前没有条⽬被选中, 值为-1
currentText()获取当前条⽬的⽂本内容.

核⼼信号

⽅法说明
activated(int);activated(const QString & text)当⽤⼾选择了⼀个选项时发出.这个时候相当于⽤⼾点开下拉框, 并且⿏标划过某个选项.此时还没有确认做出选择.
currentIndexChanged(int);currentIndexChanged(const QString& text)当前选项改变时发出.此时⽤⼾已经明确的选择了⼀个选项.⽤⼾操作或者通过程序操作都会触发这个信号
editTextChanged(const QString &text)当编辑框中的⽂本改变时发出(editable 为 true 时有效)

代码⽰例: 使⽤下拉框模拟⻨当劳点餐

  1. 在界⾯上创建三个下拉框, 和⼀个按钮.
    在这里插入图片描述

  2. 编写 widget.cpp, 初始化三个下拉框的内容
    在这里插入图片描述

  3. 编写 widget.cpp, 给按钮添加 slot 函数
    在这里插入图片描述

  4. 执⾏程序, 可以看到, 在点击确定按钮时, 就能获取到当前下拉框中选中的内容.
    在这里插入图片描述
    在这里插入图片描述

代码⽰例: 从⽂件中加载下拉框的选项
很多时候下拉框的选项并⾮是固定的, ⽽是通过读取⽂件/读取⽹络获取到的.

  1. 在界⾯上创建⼀个下拉框
    在这里插入图片描述

  2. 创建⽂件 F:/config.txt , 编写选项. 每个选项占⼀⾏
    在这里插入图片描述

  3. 修改 widget.cpp, 从⽂件中读取选项
    使⽤ ifstream 打开⽂件
    使⽤ getline 读取每⼀⾏
    使⽤ QString::fromStdString 把 std::string 转成 QString
    在这里插入图片描述

  4. 执⾏程序, 可以看到⽂件内容已经被加载到下拉框中
    在这里插入图片描述

Spin Box

使⽤ QSpinBox 或者 QDoubleSpinBox 表⽰ “微调框”, 它是带有按钮的输⼊框. 可以⽤来输⼊整数/浮点数. 通过点击按钮来修改数值⼤⼩.
QSpinBox 关键属性

属性说明
value存储的数值
singleStep每次调整的 “步⻓”. 按下⼀次按钮数据变化多少
displayInteger数字的进制. 例如 displayInteger 设为 10, 则是按照 10 进制表⽰. 设为 2 则为 2进制表⽰
minimum最⼩值
maximum最⼤值

核⼼信号

信号说明
textChanged(QString)微调框的⽂本发⽣改变时会触发.参数 QString 带有 前缀 和 后缀.
valueChanged(int)微调框的⽂本发⽣改变时会触发.参数 int, 表⽰当前的数值.

代码⽰例: 调整⻨当劳购物⻋中的份数.

  1. 在界⾯上创建下列内容
    在这里插入图片描述

  2. 编写代码, 修改 widget.cpp, 给下拉框设置初始值
    在这里插入图片描述

  3. 编写代码, 给按钮添加 slot 函数
    在这里插入图片描述

  4. 执⾏程序, 可以看到当⽤⼾选择不同的内容时, 点击按钮就能获取到对应的结果. 同时我们也⽆法输⼊⼀些超出范围的⾮法值
    在这里插入图片描述
    在这里插入图片描述

Date Edit & Time Edit

QDateTimeEdit 核⼼属性

属性说明
dateTime时间⽇期的值. 形如 2000/1/1 0:00:00
date单纯⽇期的值. 形如 2001/1/1
time单纯时间的值. 形如 0:00:00
displayFormat时间⽇期格式. 形如 yyyy/M/d H:mm

核⼼信号

信号说明
dateChanged(QDate)⽇期改变时触发.
timeChanged(QTime)时间改变时触发.
dateTimeChanged(QDateTime)时间⽇期任意⼀个改变时触发.

代码⽰例: 实现⽇期计算器

  1. 在界⾯上创建两个 QDateTimeEdit 和⼀个按钮, ⼀个 label
    在这里插入图片描述

  2. 编写计算按钮的 slot 函数
    使⽤ daysTo 函数可以计算两个⽇期的天数
    使⽤ secsTo 函数可以计算两个时间的秒数
    通过 (秒数 / 3600) 换算成⼩时数, 再余上 24 得到零⼏个⼩时
    使⽤ QString::number 把整数转成 QString 进⾏拼接
    在这里插入图片描述

  3. 执⾏程序, 观察结果
    在这里插入图片描述

Dial

使⽤ QDial 表⽰⼀个 旋钮.
在这里插入图片描述
核⼼属性

属性说明
value持有的数值.
minimum最⼩值
maximum最⼤值
singleStep按下⽅向键的时候改变的步⻓.
pageStep按下 pageUp / pageDown 的时候改变的步⻓.
sliderPosition界⾯上旋钮显⽰的 初始位置

核⼼信号

属性说明
valueChanged(int)数值改变时触发
rangeChanged(int, int)范围变化时触发

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

  1. 在界⾯上创建⼀个旋钮和⼀个 label
    在这里插入图片描述

  2. 编写 widget.cpp, 对旋钮初始化
    在这里插入图片描述

  3. 编写 widget.cpp, 设置旋钮的 valueChanged slot 函数
    在这里插入图片描述

  4. 运⾏程序, 观察效果. 可以看到随着拖动旋钮旋转, 不透明度发⽣明显变化
    在这里插入图片描述

Slider

使⽤ QSlider 表⽰⼀个滑动条.
核⼼属性

属性说明
value持有的数值.
minimum最⼩值
maximum最⼤值
singleStep按下⽅向键的时候改变的步⻓.
pageStep按下 pageUp / pageDown 的时候改变的步⻓
sliderPosition滑动条显⽰的 初始位置

核⼼信号

属性说明
valueChanged(int)数值改变时触发
rangeChanged(int, int)范围变化时触发

代码⽰例: 调整窗⼝⼤⼩

  1. 在界⾯上创建两个滑动条, 分别是⽔平和垂直滑动条
    在这里插入图片描述

  2. 编写代码初始化滑动条
    在这里插入图片描述

  3. 编写滑动条的 valueChanged slot 函数
    在这里插入图片描述

  4. 执⾏程序, 可以看到调整滑动条, 窗⼝⼤⼩就会随之改变
    在这里插入图片描述

代码⽰例: 通过⾃定义快捷键调整滑动条位置
设置 - 减⼩ value, 设置 + 增加 value

  1. 在界⾯上创建滑动条和 label
    在这里插入图片描述

  2. 编写初始化代码
    在这里插入图片描述

  3. 创建 valueChanged 的 slot 函数
    在这里插入图片描述

  4. 修改 widget.cpp 构造函数, 增加快捷键
    使⽤ QShortCut 类设置快捷键
    快捷键触发时, 会发出 QShortcut::activated 信号, 我们连接到⾃⼰写的 slot 函数
    在这里插入图片描述

  5. 编写⾃定义 slot 函数
    在这里插入图片描述

  6. 执⾏程序, 观察效果. 可以看到此时按下 - 和 + 就可以调整 value 的值
    在这里插入图片描述

多元素控件

List Widget

使⽤ QListWidget 能够显⽰⼀个纵向的列表

属性说明
currentRow当前被选中的是第⼏⾏
count⼀共有多少⾏
sortingEnabled是否允许排序
isWrapping是否允许换⾏
itemAlignment元素的对⻬⽅式
selectRectVisible被选中的元素矩形是否可⻅
spacing元素之间的间隔

核⼼⽅法

方法说明
addItem(const QString& label);addItem(QListWidgetItem *item)列表中添加元素
currentItem()返回 QListWidgetItem* 表⽰当前选中的元素
setCurrentItem(QListWidgetItem* item)设置选中哪个元素
setCurrentRow(int row)设置选中第⼏⾏的元素
insertItem(const QString& label, int row);insertItem(QListWidgetItem *item, int row)在指定的位置插⼊元素
item(int row)返回 QListWidgetItem* 表⽰第 row ⾏的元素
takeItem(int row)删除指定⾏的元素, 返回 QListWidgetItem* 表⽰是哪个元素被删除

核⼼信号

方法说明
currentItemChanged(QListWidgetItemcurrent, QListWidgetItem old)选中不同元素时会触发. 参数是当前选中的元素和之前选中的元素
currentRowChanged(int)选中不同元素时会触发. 参数是当前选中元素的⾏数
itemClicked(QListWidgetItem* item)点击某个元素时触发
itemDoubleClicked(QListWidgetItem*item)双击某个元素时触发
itemEntered(QListWidgetItem* item)⿏标进⼊元素时触发

代码⽰例: 使⽤ ListWidget

  1. 在界⾯上创建⼀个 ListView , 右键 => 变形为 => ListWidget , 再创建⼀个 lineEdit 和 两个按钮.
    在这里插入图片描述
    在这里插入图片描述

  2. 编写 widget.cpp, 在构造函数中添加初始元素
    在这里插入图片描述

  3. 编写 listWidget 的 slot 函数
    此处需要判定 current 和 previous ⾮空. 初始情况下是没有元素选中的, 就导致这俩指针可能是 NULL.
    在这里插入图片描述

  4. 编写按钮的 slot 函数
    在这里插入图片描述

  5. 执⾏程序, 观察效果. 可以新增元素, 选中元素, 删除元素
    在这里插入图片描述

Table Widget

使⽤ QTableWidget 表⽰⼀个表格控件. ⼀个表格中包含若⼲⾏, 每⼀⾏⼜包含若⼲列.
表格中的每个单元格, 是⼀个 QTableWidgetItem 对象
QTableWidget核⼼⽅法

方法说明
item(int row, int column)根据⾏数列数获取指定的 QTableWidgetItem*
setItem(int row, int column,QTableWidget*)根据⾏数列数设置表格中的元素
currentItem()返回被选中的元素 QTableWidgetItem*
currentRow()返回被选中元素是第⼏⾏
currentColumn()返回被选中元素是第⼏列

QTableWidgetItem 核⼼信号

信号说明
cellClicked(int row, int column)点击单元格时触发
cellDoubleClicked(int row, int column)双击单元格时触发
cellEntered(int row, int column)⿏标进⼊单元格时触发
currentCellChanged(int row, int column, int previousRow, int previousColumn)选中不同单元格时触发

QTableWidgetItem 核⼼⽅法

方法说明
row()获取当前是第⼏⾏
column()获取当前是第⼏列
setText(const QString&)设置⽂本
setTextAlignment(int)设置⽂本对⻬
setIcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺⼨
setFont(const QFont&)设置字体

代码⽰例: 使⽤ QTableWidget

  1. 在界⾯上创建 QTableWidget 和 三个按钮, ⼀个输⼊框
    在这里插入图片描述

  2. 编写 widget.cpp 构造函数, 构造表格中的初始数据.
    在这里插入图片描述

  3. 编写按钮的 slot 函数
    在这里插入图片描述

  4. 执⾏程序, 即可完成表格的基本操作
    在这里插入图片描述

Tree Widget

使⽤ QTreeWidget 表⽰⼀个树形控件. ⾥⾯的每个元素, 都是⼀个 QTreeWidgetItem , 每个QTreeWidgetItem 可以包含多个⽂本和图标, 每个⽂本/图标为⼀个 列.

可以给 QTreeWidget 设置顶层节点(顶层节点可以有多个), 然后再给顶层节点添加⼦节点, 从⽽构成树形结构.
QTreeWidget 核⼼⽅法

方法说明
clear清空所有⼦节点
addTopLevelItem(QTreeWidgetItem* item)新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点
topLevelItemCount()获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item)查询指定节点是顶层节点中的下标

QTreeWidget 核⼼信号

信号说明
currentItemChanged(QTreeWidgetItemcurrent, QTreeWidgetItem old)切换选中元素时触发
itemClicked(QTreeWidgetItem* item, int col)点击元素时触发
itemDoubleClicked(QTreeWidgetItem* item,int col)双击元素时触发
itemEntered(QTreeWidgetItem* item, int col)⿏标进⼊时触发
itemExpanded(QTreeWidgetItem* item)元素被展开时触发
itemCollapsend(QTreeWidgetItem* item)元素被折叠时触发

QTreeWidgetItem 核⼼属性

属性说明
text持有的⽂本
textAlignment⽂本对⻬⽅式
icon持有的图表
font⽂本字体
hidden是否隐藏
disabled是否禁⽤
expand是否展开
sizeHint尺⼨⼤⼩
selected是否选中

QTreeWidgetItem 核⼼⽅法

方法说明
addChild(QTreeWidgetItem* child)新增⼦节点
childCount()⼦节点的个数
child(int index)获取指定下标的⼦节点. 返回 QTreeWidgetItem*
takeChild(int index)删除对应下标的⼦节点
removeChild(QTreeWidgetItem*child)删除对应的⼦节点
parent()获取该元素的⽗节点

代码⽰例: 使⽤ QTreeWidget

  1. 在界⾯上创建⼀个 TreeView , 右键 => 变形为 => TreeWidget , 再创建⼀个 lineEdit 和 两个按钮.
    在这里插入图片描述
    在这里插入图片描述

  2. 编写代码, 构造初始数据
    在这里插入图片描述

  3. 编写代码, 实现按钮的 slot 函数
    在这里插入图片描述

  4. 执⾏程序, 可以针对树形框进⾏编辑
    在这里插入图片描述

容器类控件

Group Box

使⽤ QGroupBox 实现⼀个带有标题的分组框. 可以把其他的控件放到⾥⾯作为⼀组.
核⼼属性

属性说明
title分组框的标题
alignment分组框内部内容的对⻬⽅式
flat是否是 “扁平” 模式
checkable是否可选择
checked描述分组框的选择状态 (前提是 checkable 为 true)

代码⽰例: 给⻨当劳案例加上分组框

  1. 在界⾯上创建三个分组框, 并且在分组框内部创建下拉框和微调框.
    在这里插入图片描述

  2. 编写 widget.cpp, 添加初始化下拉框的代码
    在这里插入图片描述

  3. 运⾏程序, 观察效果
    在这里插入图片描述

Tab Widget

使⽤ QTabWidget 实现⼀个带有标签⻚的控件, 可以往⾥⾯添加⼀些 widget. 进⼀步的就可以通过标签⻚来切换.
核⼼属性

属性说明
tabPosition标签⻚所在的位置.
currentIndex当前选中了第⼏个标签⻚ (从 0 开始计算)
currentTabText当前选中的标签⻚的⽂本
currentTabName当前选中的标签⻚的名字
currentTabIcon当前选中的标签⻚的图标
currentTabToolTip当前选中的标签⻚的提⽰信息
tabsCloseable标签⻚是否可以关闭
movable标签⻚是否可以移动

核⼼信号

信号说明
currentChanged(int)在标签⻚发⽣切换时触发, 参数为被点击的选项卡编号.
tabBarClicked(int)在点击选项卡的标签条的时候触发. 参数为被点击的选项卡编号
tabBarDoubleClicked(int)在双击选项卡的标签条的时候触发. 参数为被点击的选项卡编号.
tabCloseRequest(int)在标签⻚关闭时触发. 参数为被关闭的选项卡编号

代码⽰例: 使⽤标签⻚管理多组控件

  1. 在界⾯上创建⼀个 QTabWidget , 和两个按钮.
    在这里插入图片描述

  2. 编写 widget.cpp, 进⾏初始化, 给标签⻚中放个简单的 label
    注意新创建的 label 的⽗元素, 是 ui->tab 和 ui->tab_2
    在这里插入图片描述

  3. 编写按钮的 slot 函数
    使⽤ count() 获取到标签⻚的个数.
    使⽤ addTab 新增标签⻚.
    使⽤ removeTab 删除标签⻚
    使⽤ currentIndex 获取到当前标签⻚的下标
    使⽤ setCurrentIndex 切换当前标签⻚.
    在这里插入图片描述

  4. 编写 QTabWidget 的 currentChanged 函数
    在这里插入图片描述

  5. 运⾏程序, 观察效果
    点击新建标签⻚, 可以创建出新的标签
    点击删除当前标签⻚, 可以删除标签
    切换标签⻚时, 可以看到 qDebug 打印出的标签⻚编号
    在这里插入图片描述

布局管理器

之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的.
也就是每个控件所在的位置, 都需要计算坐标, 最终通过 setGeometry 或者 move ⽅式摆放过去.

这种设定⽅式其实并不⽅便. 尤其是界⾯如果内容⽐较多, 不好计算. ⽽且⼀个窗⼝⼤⼩往往是可以调整的, 按照绝对定位的⽅式, 也⽆法⾃适应窗⼝⼤⼩.

因此 Qt 引⼊ “布局管理器” (Layout) 机制, 来解决上述问题

垂直布局

使⽤ QVBoxLayout 表⽰垂直的布局管理器. V 是 vertical 的缩写.
核⼼属性

属性说明
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上⽅边距
layoutBottomMargin下⽅边距
layoutSpacing相邻元素之间的间距

代码⽰例: 使⽤ QVBoxLayout 管理多个控件.

  1. 编写代码, 创建布局管理器和三个按钮. 并且把按钮添加到布局管理器中
    使⽤ addWidget 把控件添加到布局管理器中
    使⽤ setLayout 设置该布局管理器到 widget 中
    在这里插入图片描述

  2. 运⾏程序, 可以看到此时界⾯上的按钮就存在于布局管理器中. 随着窗⼝尺⼨变化⽽发⽣改变
    在这里插入图片描述
    通过上述代码的⽅式, 只能给这个 widget 设定⼀个布局管理器. 实际上也可以通过 Qt Design 在⼀个窗⼝中创建多个布局管理器

⽔平布局

使⽤ QHBoxLayout 表⽰垂直的布局管理器. H 是 horizontal 的缩写.
核⼼属性 (和 QVBoxLayout 属性是⼀致的)

代码⽰例: 使⽤ QHBoxLayout 管理控件

  1. 编写代码, 创建布局管理器和三个按钮. 并且把按钮添加到布局管理器中.
    在这里插入图片描述

  2. 运⾏程序, 可以看到此时界⾯上的按钮就存在于布局管理器中. 随着窗⼝尺⼨变化⽽发⽣改变
    在这里插入图片描述

⽹格布局

Qt 中还提供了 QGridLayout ⽤来实现⽹格布局的效果. 可以达到 M * N 的这种⽹格的效果.

核⼼属性

属性说明
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上⽅边距
layoutBottomMargin下⽅边距
layoutHorizontalSpacing相邻元素之间⽔平⽅向的间距
layoutVerticalSpacing相邻元素之间垂直⽅向的间距
layoutRowStretch⾏⽅向的拉伸系数
layoutColumnStretch列⽅向的拉伸系数

代码⽰例: 使⽤ QGridLayout 管理元素

  1. 代码中创建 QGridLayout 和 4 个按钮
    使⽤ addWidget 添加控件到布局管理器中. 但是添加的同时会指定两个坐标. 表⽰放在第⼏⾏, 第⼏列.
    在这里插入图片描述

  2. 执⾏代码, 观察效果. 可以看到当前的这⼏个按钮是按照 2 ⾏ 2 列的⽅式排列的
    在这里插入图片描述

  3. 如果调整⾏列坐标为下列代码
    在这里插入图片描述
    执⾏代码, 可以看到这⼏个按钮都在同⼀⾏了. 相当于 QHBoxLayout
    在这里插入图片描述

代码⽰例: 设置 QGridLayout 中元素的⼤⼩⽐例

  1. 创建 6 个按钮, 按照 2 ⾏ 3 列的⽅式排列
    使⽤ setColumnStretch 设置每⼀列的拉伸系数
    在这里插入图片描述

  2. 执⾏程序, 可以看到每⼀列的宽度是不同的. 并且随着窗⼝调整动态变化
    在这里插入图片描述

表单布局

除了上述的布局管理器之外, Qt 还提供了 QFormLayout , 属于是 QGridLayout 的特殊情况, 专⻔⽤于实现两列表单的布局.

代码⽰例: 使⽤ QFormLayout 创建表单

  1. 编写代码, 创建 QFormLayout , 以及三个 label 和三个 lineEdit
    使⽤ addRow ⽅法来添加⼀⾏. 每⾏包含两个控件. 第⼀个控件固定是 QLabel / ⽂本, 第⼆个控件则可以是任意控件
    如果把第⼀个参数填写为 NULL, 则什么都不显⽰.
    在这里插入图片描述

  2. 执⾏程序, 可以看到以下结果
    在这里插入图片描述

Spacer

使⽤布局管理器的时候, 可能需要在控件之间, 添加⼀段空⽩. 就可以使⽤ QSpacerItem 来表⽰
核⼼属性

属性说明
width宽度
height⾼度
hData⽔平⽅向的 sizePolicy
vData垂直⽅向的 sizePolicy

代码⽰例: 创建⼀组左右排列的按钮

  1. 在界⾯上创建⼀个 QVBoxLayout , 并添加两个按钮
    在这里插入图片描述

  2. 直接运⾏程序, 可以看到两个按钮是紧挨着的
    在这里插入图片描述

  3. 在两个按钮中间添加⼀个 spacer
    在这里插入图片描述

  4. 运⾏程序, 观察代码效果. 可以看到两个按钮之间已经存在了间隔.
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题:缺失的第一个正数

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释:范围 [1,2] 中的数字都在数组…

【微服务】------架构设计及常用组件

前言 在当今迅猛发展的软件开发领域,微服务架构已经成为构建灵活、可扩展系统的关键方法之一。本文将带领读者深入了解微服务架构的核心思想,并介绍构建这一架构所需的常用组件,为各位开发者提供全面的指导和洞察力。 BigDiagram 我们从一…

2024年4月8日腾讯云故障复盘及情况说明

2024年4月8日15点23分,腾讯云团队收到告警信息,云API服务处于异常状态;随即在腾讯云工单、售后服务群以及微博等渠道开始大量出现腾讯云控制台登录不上的客户反馈。 经过故障定位发现,客户登录不上控制台正是由云API异常所导致。云…

jmeter使用之生成html测试报告

测试的最终结果是需要给出一份报告,那么在用jmeter测试时怎么生成一份报告呢,以下针对jmeter如何生成html报告进行简单介绍 一、首先把测试脚本写好二、利用命令生成html报告 命令:jmeter -n -t 【Jmx脚本位置】-l 【结果文件result.jtl存放…

【vue】defineEmits 传值 子传父

先行知识 【vue】导入组件【vue】defineProps 传数据 父传子 传值流程 App.vue <template><Header getWeb"emitsGetWeb" userAdd"emitsUserAdd"/><hr /><p>web.name: {{ web.name }}</p><p>web.url: {{ web.url }}&…

【浅学】大模型(科普向_持续更新中)

1. 大模型概述 大模型是指具有数千万甚至数亿参数的深度学习模型。 当我们提及大模型时&#xff0c;通常指的是大语言模型&#xff08;Large Language Model&#xff0c;简称LLM&#xff09;&#xff0c;即文字问答模型&#xff0c;其典型代表便是OpenAI的GPT系列。然而&…

【PyTorch】设置CUDA_VISIBLE_DEVICES无效的问题以及多卡使用以及CUDA out of memory问题

方法1&#xff1a; 理想情况下&#xff0c;该环境变量应设置在程序的顶部。如果在设置 torch.backends.cudnn.benchmark 之后调用 CUDA_VISIBLE_DEVICES 变量&#xff0c;则更改 CUDA_VISIBLE_DEVICES 变量将不起作用。 import os os.environ["CUDA_VISIBLE_DEVICES"…

Wpf 使用 Prism 实战开发Day18

数据加载动画实现 概要&#xff1a; 当打开功能页面时&#xff0c;在数据未加载完毕前&#xff0c;希望有一个友好的等待提示。那么&#xff0c;本章通过学习Prism 中事件聚合器&#xff08;EventAggregator&#xff09;&#xff0c;并通过创建等待提示窗口&#xff0c;同时结…

asp.net core 网页接入微信扫码登录

创建微信开放平台账号&#xff0c;然后创建网页应用 获取appid和appsecret 前端使用的vue&#xff0c;安装插件vue-wxlogin 调用代码 <wxlogin :appid"appId" :scope"scope" :redirect_uri"redirect_uri"></wxlogin> <scri…

日本发现上百例食用功能性标示食品后健康受损案例

据央视新闻&#xff0c;日本消费者厅12日说&#xff0c;受小林制药公司含红曲成分问题保健品事件影响&#xff0c;他们对数千种功能性标示食品实施了紧急检查&#xff0c;发现上百例消费者健康受损案例。 小林制药问题保健品事件曝光后&#xff0c;日本消费者厅对所有备案过的…

(2024,IXC2-4KHD,LVLM,动态图像分割,高分辨率图像处理)InternLM-XComposer2-4KHD

InternLM-XComposer2-4KHD: A Pioneering Large Vision-Language Model Handling Resolutions from 336 Pixels to 4K HD 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方…

排序算法之快速排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性快速排序O( N N N log ⁡ 2 N \log_{2}N log2​N)O( N N N log ⁡ 2 N \log_{2}N log2​N)O(n^2)O( log ⁡ 2 N \log_{2}N log2​N)In-place不稳定 稳…

llamafactory:unified efficient fine-tuning of 100+ lanuage models

1.introduction llamafactory由三个主要模块组成&#xff0c;Model Loader&#xff0c;Data Worker&#xff0c;Trainer。 2.Efficient fine-tuning techniques 2.1 Efficient Optimization 冻结微调&#xff1a;冻结大部分参数&#xff0c;同时只在一小部分解码器层中微调剩…

算法1: 素数个数统计

统计n以内的素数个数 素数&#xff1a;只能被1和自身整除的自然数&#xff0c;0和1除外&#xff1b; 举例&#xff1a; 输入&#xff1a;100 输出&#xff1a;25 import java.util.*; class Test1{public static void main(String[] args){int a 100; //输入数字//…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 格式化输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字…

Linux/October

October Enumeration Nmap 扫描发现对外开放了22和80端口&#xff0c;使用nmap详细扫描这两个端口 ┌──(kali㉿kali)-[~/vegetable/HTB/October] └─$ nmap -sC -sV -p 22,80 -oA nmap 10.10.10.16 Starting Nmap 7.…

SLA——让你的信息更安全

在单一的静态密码登录验证机制下&#xff0c;非法入侵者若窃听到Windows桌面登录账号的用户名和密码&#xff0c;便可通过合法权限访问内部系统&#xff0c;此时企业信息安全将面临严峻挑战。 企业为了防止账号信息泄露&#xff0c;通常会强制要求员工定期更换登录密码&#x…

java下载网络上的文件、图片保存到本地 FileUtils

java下载网络上的文件、图片保存到本地 FileUtils 1. 引入FileUtils依赖2. 实现代码3. 输出结果 1. 引入FileUtils依赖 <!--FileUtils依赖--> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency><groupId>commons-io&l…

Linux文本编辑器vim使用和分析—6

目录 1.对vim的简单理解&#xff1a; 2.看待vim的视角&#xff1a; 3.命令模式&#xff1a; 3.1vim被打开后默认的模式&#xff1a; 3.2命令模式切换插入模式&#xff1a; 3.3其他模式回到命令模式&#xff1a; 3.4光标定位&#xff1a; 4.插入模式(编辑模式)&#xff1…

【从浅学到熟知Linux】程序地址空间分布与进程地址空间详谈(含虚拟地址到物理地址的映射)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 程序地址空间概览进程地址空间 程序地址空间概览 我们在执行一个C语言程序时&#xff0c;它包含代码、变量…