目录
第 1章搭建 PySide开发环境 ···· 1
1.1配置 Python ·· 1
1.2配置 Visual Studio Code · 2
1.2.1 Windows · 2
1.2.2 Linux· 2
1.2.3 macOS····· 2
1.2.4 VS Code配置用户数据目录 3
1.2.5 安装 Python扩展 3
1.3创建 Python虚拟环境(可选) 3
1.4安装 PySide6库 · 4
1.5在 VS Code中选择 Python解析器·· 4
1.6验证开发环境是否搭建成功 ····· 5
第 2章 Qt基础对象 ·· 6
2.1 QObject类与 Qt对象模型 ··· 6
2.2建立对象的层级关系 ····· 6
2.3事件与 event方法 ···· 7
2.3.1 接受与忽略事件 · 9
2.3.2 sendEvent与 postEvent 10
2.3.3 自定义事件 · 12
2.3.4 事件过滤器 · 14
2.4信号与槽 ···· 16
2.4.1 一个信号连接多个槽 ··· 17
2.4.2 带参数的信号 ··· 18
2.4.3 使用 C++成员方法的签名格式 ····· 19
2.4.4 信号的类型重载 ····· 20
2.4.5 让信号与槽自动建立连接 · 21
2.4.6 示例:随机变换窗口的背景颜色 ·· 22
2.4.7 信号阻绝器 · 24
2.5字节序列—— QByteArray · 26
2.5.1 替换字符串 · 27
2.5.2 数值到字符串的转换 ··· 28
2.5.3 字符串到数值的转换 ··· 28
2.5.4
重复字符串 · 29
2.5.5
数据截取 ···· 29
2.5.6
切片 30
2.5.7
Base64字符串·· 31
2.5.8
拆分字符串 · 32
2.5.9
频数统计 ···· 32
2.6 QBuffer · 32
2.6.1
基本的读写操作 ····· 32
2.6.2
使用已有的 QByteArray对象·· 34
2.6.3
设置读写位置 ··· 34
2.7位序列—— QBitArray·· 35
2.7.1
设置和清除二进制位 ··· 35
2.7.2
频数统计 ···· 36
2.8 QSysInfo ····· 36
2.9
Qt的动态属性 ·· 37
2.10生成随机数
····· 38
2.
10.1设置随机数的种子 ··· 38
2.
10.2使用内置的 QRandomGenerator实例 ··· 40
2.
10.3指定随机数的范围 ··· 40
第 3章 Qt应用程序 42
3.
1三个应用程序类 ····· 42
3.
2示例:控制台应用程序 ····· 43
3.3命令行参数
44
3.3.1
示例:分析位置参数 ··· 45
3.3.2
添加选项参数 ··· 46
3.3.3
示例:分析选项参数 ··· 47
3.3.4
帮助信息和版本信息 ··· 48
3.3.5
示例:显示帮助信息 ··· 48
3.3.6
parse方法与 process方法·· 50
3.3.7
示例:通过命令行参数运行其他应用程序 ···· 50
3.3.8
示例:根据命令行参数设定窗口的呈现方式 52
3.
4图形化应用程序 ····· 53
第 4章 QWindow···· 55
4.1关于
QWindow类 ·· 55
4.1.1
一个简单的窗口 ····· 55
4.1.2
窗口标题 ···· 56
4.1.3
设置窗口的位置和大小 ····· 56
4.1.4
示例:设置窗口的位置和大小 ····· 57
4.1.5
示例:处理窗口的 Resize事件····· 57
4.2绘制窗口内容
··· 58
4.2.1 QBackingStore ·· 59
4.2.2 示例:绘制三角形 · 60
目录 V
4.2.3 QFont ···· 62
4.2.4 示例:在窗口上绘制文本 · 62
4.3 QRasterWindow 63
4.4鼠标事件
···· 64
4.4.1 QMouseEvent···· 64
4.4.2
示例:实时记录鼠标指针的位置 ·· 64
4.4.3
示例:处理鼠标按键事件 · 66
4.5键盘事件
···· 66
4.5.1
示例:绘制键盘输入的字符 ··· 67
4.5.2
示例:通过方向键移动窗口 ··· 68
4.6嵌套窗口
···· 69
4.6.1
示例:父子窗口 ····· 69
4.6.2
示例:按钮 · 70
第 5章窗口组件 ····· 74
5.1
QWidget类· 74
5.1.1
示例: QWidget类的简单用法 74
5.1.2
示例:父子窗口 ····· 75
5.
2窗口的显示方式 ····· 77
5.3拖放操作
···· 78
5.3.1
QMimeData类·· 78
5.3.2
QDrag类····· 79
5.3.3
DropAction枚举····· 79
5.3.4
示例:拖放数据到其他程序 ··· 80
5.3.5
拖放事件 ···· 82
5.3.6 QDropEvent 82
5.3.7 QDragMoveEvent ··· 82
5.3.8 QDragEnterEvent···· 83
5.3.9 QDragLeaveEvent··· 83
5.
3.10拖放事件的传递 ··· 83
5.
3.11示例:通过拖放打开图像文件 ···· 83
5.
3.12示例:拖放取色器 ····· 85
5.4剪贴板
·· 87
5.4.1
示例:复制与粘贴文本内容 ··· 88
5.4.2
示例:监视剪贴板的数据变化 ····· 89
5.4.3
示例:复制和粘贴自定义数据 ····· 90
5.
5调整窗口的透明度 · 92
5.6调色板
·· 93
5.6.1
示例:切换颜色主题 ··· 94
5.6.2
示例:带纹理的背景画刷 · 96
6.
1常用的按钮组件 ····· 98
第 6章按钮 · 98
6.2 QPushButton···100
6.2.1
示例:将多个按钮的 clicked信号绑定到同一个方法 ··· 100
6.2.2
示例:按钮的“开关”状态 · 101
6.2.3
重复按钮 ·· 101
6.2.4
示例:使用重复按钮调整矩形的宽度 ···· 102
6.2.5
示例:带下拉菜单的按钮 ····· 103
6.3 QCheckBox····· 104
6.3.1
示例:请选择你喜欢的早餐 · 105
6.3.2
示例:让 QCheckBox对象之间相互排斥 ···· 106
6.4 QRadioButton · 107
6.4.1
示例:使用 QGroupBox为 QRadioButton列表分组 ····· 107
6.4.2
示例:使用 QButtonGroup类为 QRadioButton分组 ····· 108
6.5按钮分组
·· 109
6.5.1
示例:修改矩形的颜色 ··· 110
6.5.2
示例:调整 QLabel组件的字体大小 111
6.
6在按钮上显示图标 ····· 113
6.6.1
示例:带图标的按钮 · 114
6.6.2
示例:为“禁用”状态自定义图标 ·· 115
6.6.3
示例: QPushButton的“开关”图标 ····· 116
6.6.4
示例:手动绘制图标 · 117
6.7按钮与快捷键
· 118
第 7章布局 ····· 120
7.1布局管理
·· 120
7.2“盒子”模型
··120
7.2.1
示例: QBoxLayout的基本用法 ·· 120
7.2.2
两个便捷类型 · 122
7.2.3
拉伸比例 ·· 123
7.2.4
示例:如何避免子项空间被拉伸 124
7.3网格布局
·· 125
7.3.1
示例:三行三列的网格布局 · 125
7.3.2
跨行/跨列布局 126
7.3.3
示例:跨列布局 ··· 127
7.3.4
示例:调整行 /列的拉伸比例 127
7.
4组件的缩放策略 ··· 129
7.4.1
修改缩放策略 · 130
7.4.2
示例:调整按钮的缩放策略 · 131
7.5表单布局
·· 131
7.5.1
addRow方法 ·· 132
7.5.2
示例:填写收件人信息 ··· 132
7.6 QStackedLayout····134
7.6.1
示例:使用方向按键切换 QStackedLayout中的组件···· 134
7.6.2
示例:使用 QStackedWidget组件····· 136
目录 VII
第 8章输入组件 ··· 138
8.1 QLineEdit · 138
8.1.1
setText方法和 insert方法的区别 139
8.1.2
示例:对比 setText方法和 insert方法 ··· 139
8.1.3
示例:限制昀大字符数 ··· 139
8.1.4
输入掩码 ·· 140
8.1.5
示例:日期输入掩码 · 141
8.1.6
自动完成 ·· 142
8.1.7
示例:自动完成的简单应用 · 142
8.1.8 CompletionMode··· 143
8.2 QTextEdit·· 145
8.2.1
示例:设置文本的颜色 ··· 145
8.2.2
示例:显示 HTML内容·· 146
8.2.3
示例:通过 HTML呈现图像 148
8.2.4
示例:显示 Markdown内容·· 149
8.2.5
示例:自定义上下文菜单 ····· 150
8.3数值输入组件
· 151
8.3.1
示例: QSpinBox与 QDoubleSpinBox的使用 ···· 152
8.3.2
示例:设置数值的有效范围 · 153
8.3.3
示例:改变按钮符号 · 154
8.3.4
示例:“回旋”数值 · 155
8.3.5
前缀与后缀 ····· 155
8.3.6
步长值 156
8.3.7
QDoubleSpinBox组件的精度 156
8.4日期和时间
···· 157
8.4.1
示例:获取 QDateTimeEdit中输入的值 · 157
8.4.2
示例:使用日历组件 · 159
8.4.3
独立使用 QCalendarWidget ··· 160
第 9章容器组件 ··· 161
9.1将
QWidget组件作为容器 ····· 161
9.
2示例:自定义容器 ····· 162
9.3 QFrame ····· 163
9.3.1
边框形状 ·· 163
9.3.2
阴影效果 ·· 164
9.3.3
示例: Box与 Panel形状的区别 · 164
9.3.4
示例:“凸起”和“凹陷”阴影的区别 · 165
9.3.5
中线( mid-line) ·· 166
9.3.6
setFrameStyle方法 ····· 166
9.4 QTabWidget ···· 167
9.4.1
示例:动态添加页面 · 167
9.4.2
示例:设置标签栏的位置 ····· 168
9.4.3
示例:带图标的标签 · 169
9.4.4
使用快捷键 ····· 170
9.5 QGroupBox····· 170
9.5.1
示例: QGroupBox的基础用法··· 170
9.5.2
示例:设置标题的对齐方式 · 171
9.5.3
示例:启用分组框的 Check功能 ····· 172
9.6 QScrollArea ···· 173
9.6.1
示例:在 QScrollArea中承载自定义组件···· 173
9.6.2
示例:设置内容组件的对齐方式 175
9.6.3
示例:拉伸图像 ··· 177
9.7 QToolBox·· 178
9.7.1
示例:带图标的工具箱条目 · 178
9.7.2
示例:处理 currentChanged信号 180
第 10章菜单栏、工具栏与状态栏 ···· 181
10.1 QMenu ···· 181
10.1.1
示例:两种添加 QAction的方案 ·· 181
10.1.2
示例:处理 QMenu的 triggered信号 · 182
10.1.3
示例: exec方法和 popup方法的区别 184
10.2
菜单栏 ···· 184
10.2.1
示例:向菜单栏添加菜单 · 185
10.2.2
示例:在布局中使用菜单栏 ··· 185
10.2.3
示例:子菜单 ··· 186
10.2.4
示例:添加带图标的菜单 · 187
10.2.5
带 check标记的菜单 ···· 188
10.3
工具栏 ···· 189
10.3.1
图标大小与样式 ····· 189
10.3.2
示例:工具栏的基础用法 · 189
10.3.3
示例:在 QMainWindow中使用工具栏 ··· 190
10.4
contextMenu事件····· 191
10.4.1
QContextMenuEvent类 191
10.4.2
示例:用上下文菜单改变窗口颜色 ···· 192
10.5
状态栏 ···· 193
10.5.1
addWidget与 addPermanentWidget方法 ··· 193
10.5.2
示例:状态栏实时显示窗口的大小 ···· 194
10.5.3
示例:在 QMainWindow中使用状态栏 ··· 195
10.6
快捷键 ···· 196
10.6.1
示例:使用快捷键 · 196
10.6.2
标准快捷键 · 198
10.7 QWidgetAction ··· 199
10.7.1
示例:在菜单中显示滑动条组件 ·· 199
10.7.2
示例:在上下文菜单中使用自定义组件 ·· 200
目录 IX
第 11章主窗口 ····· 203
11.1 QMainWindow····203
11.1.1
示例:设置主窗口的内容组件 203
11.1.2
示例:构建较复杂的主窗口 ···· 204
11.1.3
示例:在运行阶段添加或删除工具栏 206
11.2 QDockWidget 207
11.2.1 DockWidgetArea ····· 208
11.2.2
示例:简单的 Dock窗口··· 208
11.2.3
allowedAreas属性 ·· 210
11.2.4
示例: QDockWidget与菜单栏 210
11.3 MDI··· 211
11.3.1
添加子窗口 · 212
11.3.2
示例:简单的 MDI应用程序·· 212
11.3.3
示例:打开多个文本文件 ·· 214
11.3.4
示例:排列子窗口 · 216
11.3.5
示例:标签页视图 · 218
第 12章交互组件 · 220
12.1
进度条 ···· 220
12.1.1
示例:水平和垂直进度条 · 220
12.1.2
示例:模拟耗时任务 ··· 221
12.1.3
示例:设置进度文本的格式 ··· 223
12.2
滑动条 ···· 224
12.2.1
示例:处理 valueChanged信号····· 225
12.2.2
示例:设置刻度的显示位置 ··· 225
12.2.3
步长 227
12.2.4
示例:设置 QSlider组件的步长 ··· 227
12.3
仪表盘 ···· 229
12.3.1
示例:使用 QDial组件 ····· 229
12.3.2
示例:显示刻度线 · 230
12.3.3
wrapping属性··· 231
12.4 QLCDNumber····· 232
12.4.1
示例:显示整数和浮点数 · 232
12.4.2
示例:切换进制 ····· 233
12.5
托盘图标 234
12.5.1
示例:显示和隐藏托盘图标 ··· 234
12.5.2
示例:添加上下文件菜单 · 235
12.5.3
示例:发送“气球”消息 · 235
12.6
工具提示 237
12.6.1
示例:使用 setToolTip方法 ···· 237
12.6.2
示例:拦截 ToolTip事件··· 237
12.6.3
示例:在工具提示中使用 HTML · 239
12.6.4
示例:修改调色板 · 240
第 13章对话框 ····· 242
13.1 QDialog··· 242
13.1.1
示例:实现自定义对话框 · 242
13.1.2
示例:异步对话框 · 244
13.2 QInputDialog 245
13.2.1
示例: QInputDialog的基本用法 ·· 246
13.2.2
QInputDialog的信号 ···· 248
13.2.3
示例:实时显示输入内容 · 248
13.2.4
示例:使用下拉列表框完成文本输入 250
13.2.5
便捷方法 ····· 251
13.2.6
示例:使用便捷方法打开输入对话框 252
13.3 QColorDialog 253
13.3.1
示例:设置文本颜色 ··· 253
13.3.2
自定义颜色区域 ····· 254
13.3.3
示例:使用便捷方法 ··· 255
13.4 QFileDialog··· 256
13.4.1
示例:切换文件选择模式 · 256
13.4.2
示例:选择目录 ····· 258
13.4.3
便捷方法 ····· 258
13.5 QFontDialog · 261
13.5.1
示例:使用新增的 open方法·· 261
13.5.2
示例:使用便捷方法 ··· 262
13.6 QDialogButtonBox ··· 263
13.6.1
按钮角色 ····· 263
13.6.2
示例:使用按钮角色 ··· 264
13.6.3
标准按钮 ····· 265
13.6.4
示例:展示所有标准按钮 · 266
13.6.5
示例:标准按钮与 clicked信号 ···· 267
13.6.6
示例:用户注册对话框 ····· 268
13.7 QWizard··270
13.7.1
示例:创建简单的向导对话框 271
13.7.2
WizardButton枚举·· 272
13.7.3
示例:设置按钮的文本 ····· 272
13.7.4
示例:重写 nextId方法 ····· 273
13.7.5
示例:共享页面数据 ··· 274
13.7.6
向导风格与图标 ····· 276
13.7.7
示例:为向导设置图标 ····· 277
13.7.8
示例:使用自定义按钮 ····· 278
13.8 无按钮对话框 ····· 279
13.9 QMessageBox ····· 283
13.9.1
示例:使用标准按钮 ··· 283
13.9.2
示例:使用标准图标 ··· 284
13.9.3
静态成员 ····· 286
13.9.4
示例:使用静态方法 ··· 287
第 14章列表模型与视图 ·· 289
14.1 模型的抽象基类 · 289
14.1.1 ItemDataRole ···· 290
14.1.2
示例:整数列表模型 ··· 290
14.1.3
推荐的基础模型 ····· 292
14.1.4
示例:学生表 ··· 292
14.1.5
示例:突出显示销量高于平均值的行 294
14.2 QStringListModel ····· 296
14.3 QStandardItemModel 297
14.3.1
示例:员工信息表 · 297
14.3.2
示例:显示图标 ····· 299
14.3.3
示例:树形视图 ····· 300
14.3.4
示例:多列树形视图 ··· 301
14.4 QFileSystemModel ··· 303
14.4.1
示例:显示目录和文件 ····· 303
14.4.2
示例:使用过滤器 · 304
14.4.3
示例:创建和删除目录 ····· 305
14.5 编辑功能 306
14.5.1
示例:可编辑列表 · 307
14.5.2
插入和删除数据 ····· 309
14.5.3
示例:新增 /删除图书信息 310
14.6 QListWidget··314
14.6.1
示例:添加与删除列表项 · 315
14.6.2
示例:排序 · 316
14.7 QTableWidget ····· 318
14.7.1
示例:订单表 ··· 318
14.7.2
示例:身高信息表 · 319
14.8 QTreeWidget·320
第 15章目录与文件 ··· 322
15.1 QDir··322
15.1.1
示例: QDir类的基本用法 322
15.1.2
示例:复制和移动目录 ····· 323
15.1.3
枚举目录和文件 ····· 325
15.1.4
示例:列出动态链接库文件并按大小排序 ···· 326
15.1.5
示例:创建和删除目录 ····· 327
15.2 QFile · 328
15.2.1
示例:追加文件内容 ··· 329
15.2.2
示例:读写文本文件 ··· 330
15.2.3
示例:创建符号链接 ··· 332
15.3 QSaveFile 332
15.4 QBuffer ··· 333
15.5 QTextStream · 334
15.5.1
示例: QTextStream类的简单使用 334
15.5.2
示例:字段宽度与对齐方式 ··· 334
15.5.3
示例:写入不同进制的整数 ··· 335
15.6 QDataStream·336
15.6.1
示例:简单的读写操作 ····· 336
15.6.2
示例:保存和恢复调色板数据 337
第 16章动画 ··· 340
16.
1与动画有关的类型 ··· 340
16.2
基于属性的动画 · 340
16.2.1
示例:简单的位移动画 ····· 341
16.2.2
示例: stateChanged信号··· 342
16.3
自定义属性 ··· 344
16.4
关键帧动画 ··· 347
16.5
动画分组 348
16.5.1
示例:按顺序运行的动画分组 348
16.5.2
示例:并行的动画分组 ····· 349
第 17章 Qt样式表 351
17.1
Qt样式表概述 ···· 351
17.1.1
基本格式 ····· 351
17.1.2
示例:如何设置样式表 ····· 353
17.1.3
示例:样式的继承和覆盖 · 354
17.1.4
示例:从文件加载 QSS····· 355
17.2
盒子模型 356
17.2.1
示例:设置按钮的外边距 · 357
17.2.2
示例:设置 QListWidget对象的内边距 ··· 358
17.2.3
边框 359
17.2.4
示例:为 QLabel组件设置边框样式·· 360
17.2.5
圆角边框 ····· 362
17.2.6
示例:带圆角边框的按钮 · 362
17.3
颜色 ·· 363
17.3.1
示例:设置 QLabel组件的文本颜色 ·· 364
17.3.2
示例:设置 QWidget的背景颜色 · 365
17.4
渐变画刷 366
17.4.1
线性渐变 ····· 366
17.4.2
示例:使用线性渐变颜色填充背景 ···· 367
17.4.3
径向渐变 ····· 368
17.4.4
示例:移动径向渐变的圆心位置 ·· 369
17.4.5
示例:移动径向渐变的焦点位置 ·· 370
17.4.6
锥形渐变 ····· 371
17.4.7
示例:使用锥形渐变填充 QFrame组件 ··· 372
17.4.8
渐变区域的延展方案 ··· 373
17.4.9
示例:在径向渐变中使用 spread参数 ····· 375
17.5
字体 ·· 376
17.5.1
示例:设置 QLabel和 PushButton组件的字体 ···· 377
17.5.2
示例:为 QTableWidget设置字体 378
17.5.3
示例:转换大小写 · 379
17.6
伪状态 ···· 381
17.6.1
示例:自定义 QPushButton的样式 ···· 382
17.6.2
示例: QRadioButton被选择后的样式 384
17.6.3
示例:自定义列表项的外观 ··· 384
17.7
子控件 ···· 385
17.7.1
示例:使用渐变画刷填充被选中的列表项 ···· 386
17.7.2
示例:自定义 QCheckBox的状态指示图标 ·· 387
17.7.3
示例:设置 QTableWidget的表头样式 ····· 388
第 18章多线程 ····· 390
18.1
单线程与多线程的比较 · 390
18.2
QThread类 ··· 390
18.2.1
示例:随机变换颜色 ··· 391
18.2.2
示例:使用 moveToThread方法 ··· 393
18.3 QThreadPool · 395
18.3.1 QRunnable ·· 395
18.3.2 示例:向 QThreadPool投放 3个任务 395
18.4 互斥锁 ···· 398
18.4.1
示例:将 QMutex用于多线程运算 ···· 399
18.4.2
示例:使用 QMutexLocker类· 401
18.5 QWaitCondition ·· 402
18.5.1
示例:多阶段任务 · 403
18.5.2
示例:等待键盘输入 ··· 404
第 19章 QML基础····· 406
19.1
QML与 QtQuick 406
19.2
QML文档的结构····· 407
19.2.1
import语句 · 407
19.2.2
对象声明 ····· 408
19.3
加载 QML文档·· 409
19.3.1 QQmlApplicationEngine ····· 409
19.3.2 示例:使用 QQmlApplicationEngine类加载 QML文件·· 409
19.3.3 QQuickView 410
19.3.4 示例:使用 QQuickView类加载 QML文档 ·· 411
19.4
QQuickItem类···· 412
19.5
布局 ·· 412
19.5.1
示例:使用 x、y属性定位矩形···· 412
19.5.2
示例: Z顺序 ··· 414
19.5.3
示例: Column ·· 415
19.5.4
示例: Row · 416
19.5.5
示例: Grid · 417
19.5.6
示例: RowLayout ·· 418
19.5.7
示例:在 GridLayout中定位子对象 ··· 419
19.6
控件基类—— Control····· 421
19.6.1
示例:处理鼠标单击事件 · 422
19.6.2
示例:处理键盘事件 ··· 423
19.7
按钮控件 425
19.7.1
示例: Button···· 426
19.7.2
示例: CheckBox ···· 427
19.7.3
示例: RadioButton· 429
19.7.4
示例: ButtonGroup 430
19.8
输入控件 431
19.8.1
示例: TextInput ····· 431
19.8.2
示例: TextField 432
19.8.3
示例: SpinBox· 433
19.8.4
示例: SpinBox中数值与文本的转换 · 434
19.8.5
示例: Slider ····· 436
19.8.6
示例: RangeSlider · 436
19.9
菜单 ·· 438
19.9.1
示例:上下文菜单 · 439
19.9.2
示例:使用 Action对象 ···· 440
19.9.3
示例:菜单栏 ··· 442
19.9.4
示例:带图标的菜单项 ····· 443
19.10工具栏
·· 444
19.
11列表控件—— ListView· 447
19.11.1 ListModel 447
19.
11.2示例:使用 ListModel类定义简单列表 448
19.11.3代理
··· 449
19.11.4 XmlListModel ·····449
19.12在
QWidget中呈现 QtQuick对象 · 451