QT常用控件

news2024/12/27 13:39:15

常用控件

  • 控件概述
  • 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. 运⾏程序, 观察代码效果. 可以看到两个按钮之间已经存在了间隔.
    在这里插入图片描述

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

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

相关文章

[尚硅谷 flink] 状态管理 笔记

文章目录 10.1 状态概述10.2 状态分类1)托管状态(Managed State)和原始状态(Raw State)2)算子状态(Operator State)和按键分区状态(Keyed State) 10.3 按键分…

【OTA】STM32-OTA升级——持续更新

【OTA】STM32-OTA升级——持续更新 文章目录 前言一、ymodem串口协议1、Ymodem 协议2、PC3、蓝牙4、WIFI云平台 二、UDS车载协议1.UDS协议 总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、ymodem串口协议 1、Ymodem 协议 STM32 Ymodem …

React 组件生命周期对比:Class vs. 函数式

在 React 中,Class 组件和函数式组件的生命周期存在一些差异。通过对 React 中 Class 组件和函数式组件的生命周期进行对比,详细探讨了它们在设计哲学、生命周期管理和开发技巧上的异同。全面了解 React 中两种组件类型的生命周期特点,以及如…

10个Python接私活平台,打破职场信息闭塞,告别死工资!

前言 Python是一种简单易学、高效强大的编程语言,正变成越来越多人选择的热门技能。不论你是否有编程基础,在学习Python的道路上,坚持每天投入2小时,你将看到巨大的回报。 学习Python不仅可以为你提供更多就业机会,还…

微信小程序 uniapp+vue.js医疗在线问诊挂号系统4oy17

预约挂号系统的逐渐发展,进一步方便了广大用户,使其可以更方便、快捷地预约挂号,并且也有效地防止号贩子“倒号”,使用户预约挂号更公平,然而现有预约挂号系统或多或少有所欠缺 小程序前端框架:uniapp 小程…

【问题解决】ubuntu安装新版vscode报code-insiders相关错误

问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb ,双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错,执行其他命令也报错。 安装环境:ubuntu18.04 dpkg: 处理软件包 code-insiders (…

现在租一个服务器多少一个月啊?

现在租一个服务器多少一个月?优惠价格低至3.8元1个月,租用一个月云服务器收费价格表:阿里云和腾讯云2核2G3M服务器优惠价格61元一年,折合一个月5元,京东云轻量云主机5.8元一个月,华为云服务器优惠价格3.8元…

同态加密:重塑数据隐私与安全的未来

同态加密技术是当今信息安全领域的一个重要研究方向,它允许在加密数据上直接进行计算,而无需将数据解密。这种加密方式对于保护数据隐私和增强云计算安全具有重要意义。在这篇文章中,我们将深入探讨同态加密的基本概念、技术特点、应用场景以…

每日一题---OJ题: 返回倒数第 k 个节点

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---返回倒数第k个结点,准备好了吗? 我们开始咯! 比如: 总共有5个结点,分别为 1->2->3->4->5 , 找倒数第一个结点,也就是"5" 题目很容易理解,我们先提供第一种思路 思路一: 假设链表长度为 n ,…

大数据实训进行时:数据标注项目

数据标注项目 培训目的 让同学们先熟悉理论知识,如:识别障碍物是否满足拉框的要求,如何进行拉框;熟悉标注操作,培养出能够进入正式项目的人员 培训地点 理论:学术报告厅、阶梯教室 实操:1实…

LeetCode-32. 最长有效括号【栈 字符串 动态规划】

LeetCode-32. 最长有效括号【栈 字符串 动态规划】 题目描述:解题思路一:辅助栈解题思路二:动态规划解题思路三:0 题目描述: 给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且…

Redis的RDB文件

Redis持久化 Redis是操作内存的,所以是内存数据库,断电即失,所以需要持久化 RDB 文件名:dump.rdb # The filename where to dump the DB dbfilename dump.rdb在指定时间间隔内,将内存中的数据,集体快照写入磁盘内&…

linux如何使 CPU使用率保持在指定百分比?

目录 方法1:(固定在100%) 方法2:(可以指定0~100%) 方法3:使用ChaosBlade工具(0~100%) 方法1:(固定在100%) for i in seq 1 $(cat /pro…

Leetcode算法训练日记 | day25

一、组合总和Ⅲ 1.题目 Leetcode:第 216 题 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺…

gemini1.5 API调用

https://ai.google.dev/pricing?hlzh-cn 查询可用的model https://generativelanguage.googleapis.com/v1beta/models?keyxxx 使用postman调用 https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?keyxxx https://ai.google…

数学基础:矩阵

来自: https://www.shuxuele.com/algebra/matrix-determinant.html 一、矩阵的行列式 二、矩阵简单知识 三、矩阵乘法 四、单位矩阵 五、逆矩阵一:简单2阶矩阵求法 六、逆矩阵二:3、4阶逆矩阵求法 6.1 求余子式矩阵 6.2 求代数余子式矩阵 6.3 求伴随矩阵…

练习题(2024/4/13)

1长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1&am…

WebService反向代理的配置和

WebService反向代理的配置和 家都知道,联网上有很多被墙了的网站,虽然这是让人很伤心的一件事情,但还好咱们有办法绕过这个限制,那就是使用IP代理。今天我就来给大家讲讲如何配置和使用WebService反向代理。 什么是WebService反向…

【AR】使用深度API实现虚实遮挡

遮挡效果 本段描述摘自 https://developers.google.cn/ar/develop/depth 遮挡是深度API的应用之一。 遮挡(即准确渲染虚拟物体在现实物体后面)对于沉浸式 AR 体验至关重要。 参考下图,假设场景中有一个Andy,用户可能需要放置在包含…

整体性学习

整体性学习的顺序: 1.获取 2.理解(明白)3.拓展(探究)4.纠错(调试)5.应用 测试伴随每一个过程 例如: 吃饭(去学习)–>点菜(学什么&#xff0c…