Skip to content

Latest commit

 

History

History
525 lines (473 loc) · 36.2 KB

README.md

File metadata and controls

525 lines (473 loc) · 36.2 KB

关于项目

该项目是《PySide6/PyQt6快速开发与实战》源代码。
本人是书籍的作者,以下是本书的内容:

本书提供了PySide6和PyQt6两套源代码,这两套源代码在gitee或github都可以查到. 源代码在gitee和github上会同步更新,国内用户访问gitee速度更快一些
github传送门:
PySide6-codes
PyQt6-codes
gitee传送门:
PySide6-codes
PyQt6-codes

本书结构

本书共有9章,基本包含了PySide6/PyQt6涉及的绝大多数常用知识点及一些经典的应用。书中各个章节侧重点不同,相对独立,读者亦可把本书当做小百科书,根据目录即可获取自己所需的内容。

第1章介绍PySide/PyQt的入门知识,主要介绍PySide和PyQt的基本概念、PySide6/PyQt6的安装和使用(包括Qt Designer(Qt设计师)等工具的初步用法)、经典IDE(PyCharm、VSCode、Eric7)的安装与配置以及完整案例的运行。已经有一定基础的朋友可以略去这一章。

第2章介绍Qt Designer的详细用法。 Qt Designer是一个PySide/PyQt的可视化界面编辑程序,它的作用是通过鼠标拖拽等可视化操作就可以快速开发出GUI文件(.ui文件),我们可以通过官方提供的uic工具把.ui文件自动转换成我们熟悉的*.py文件。在本章,可以很直观的看到一个完整的PySide/PyQt程序开发流程,如窗口布局、设置快捷键、信号与槽的绑定、菜单栏与工具栏、添加与使用资源文件等等。对PySide/PyQt初学者来说,本章内容是快速入门和快速进步的最重要章节。

第3章和第4章介绍PySide/PyQt的基本窗口控件的使用方法。我们在第一章介绍了PySide/PyQt的环境配置,第二章介绍了PySide/PyQt完整开发流程,接下来最想知道的是PySide/PyQt有哪些常用控件以及如何使用这些控件?这就是这两章要解决的问题。原本这些内容应该放在一章中,但是因为内容太多所以要拆分成2章。可以看到,这部分内容经过极限压缩之后也有200页篇幅,内容足够丰富。如果读者的时间并不充裕,只对部分控件感兴趣,则可以选择相应的小节阅读。

第5章介绍PySide/PyQt的特殊控件——表格与树。本章主要介绍表格与树的用法,入门起来也非常简单。如果想要更进一步,还需要理解Model/View/Delegate(模型/视图/委托)框架,这也是表格与树特殊性的原因。此外,数据量较大的表格往往需要数据库支撑,所以数据库相关内容也在本章涉及。

第6章介绍一些高级窗口控件,会介绍除了3-5章之外的其他常用控件或内容,也是介绍控件的最后一章。本章介绍的控件相对高级一些,比较常用的是布局管理与多窗口控件(容器)。本章也会介绍窗口风格、多线程、网页交互、样式表QSS等内容,最后以Qt Quick(QML)收尾

第7章介绍信号/槽和事件。本章对PySide/PyQt的高级内容进行收尾,是介绍PySide/PyQt框架的最后一部分内容。之前的章节已经初步学习了信号/槽的使用方法,但不够详细,本章会对信号/槽和事件进行系统性的介绍,比如内置信号/槽、自定义信号/槽、装饰器信号/槽、信号/槽断开与连接、多线程信号/槽、事件处理的常用方法等

第8章介绍Python的扩展应用。前面1-7章介绍的是PySide/PyQt框架内的内容,本章介绍Python对PySide/PyQt的扩展。学习PySide/PyQt的一大好处是可以结合Python生态提高开发效率。Python生态非常多,本章只会介绍部分常用生态如PyInstaller、Pandas、Matplotlib、PyQtGraph、Plotly等,使用这些生态可以帮助我们更快的开发出GUI程序。

第9章介绍PySide/PyQt的实战应用。由于本书内容太多,删减了一些案例,最后只保留2个应用供读者参考。一个是作为量化投资的GUI显示,另一个是券商投研中基于网络爬虫的GUI界面

此外,本书附录内容也很重要,供读者参考

附录A:介绍PySide/PyQt各个版本之间相关转换的问题,主要介绍两部分内容:

  • PySide6/PyQt6之间相互转换
  • PySide2/PyQt5转换成PySide6/PyQt6

附录B:通过一个案例分析如何把Qt的C++代码转换成PySide/PyQt的Python代码。Qt的生态还是要比PySide/PyQt更丰富一些,有时候需要把Qt的demo转换成PySide/PyQt的demo,可参考该章节。

附录C:列出一些常用表格目录。本书有很多枚举、属性、函数参数等用法以表格形式呈现,绝大部分表格可以根据目录快速定位到,有些表格比较常用但又没办法快速定位,会在这里列出。

附录D:列举一些笔者了解的基于PySide/PyQt的优秀开源项目。本书只会对这些项目进行简单介绍,感兴趣的读者可自行研究。

本书运行环境

本书同样提供了可运行本书所有案例的PySide6/PyQt6免安装版环境,仅适用于windows系统。该环境是一个压缩包,解压缩后即可使用,不会影响系统的默认环境,适合对Python刚入门的新手或不想为本书重新安装一个环境的老手。
本书提供了PySide6和PyQt6两套独立环境,对应Qt版本6.2.3,都是基于WinPython封装。理论上来说使用更高版本的PySide6/PyQt6也是可以跑通本书代码的。

  • 若想使用PySide6环境,请下载并解压WPy64-3870-pyside6.zip文件。
  • 若想使用PyQt6环境,请下载并解压WPy64-3870-pyqt6.zip文件。
  • 若想在此环境基础之上添加其他模块,请打开“WinPython Command Prompt.exe”并在里面通过pip安装

运行环境可通过百度云获取,链接:https://pan.baidu.com/s/1DM2sqr_6dK4AbWBA4BaMMg?pwd=cfwf 提取码:cfwf

本书附赠电子版

由于本书内容太多,为减轻读者负担,必须节约篇幅以降低定价。因此剥离出部分章节内容,以附赠电子版的形式呈现出来。附赠电子版与源代码放在一起,路径为“appendix/《PySide6-PyQt6快速开发与实战》附赠电子版.pdf”,这部分内容有40+页。

前 言

Python是世界上最广泛、最简单的编程语言之一,Qt是世界上最好的桌面程序开发库之一。PyQt是Python与Qt结合的产物,PyQt借助Qt和Python两大生态,一诞生就广受欢迎,可以说是Python中应用最广泛的桌面程序开发(GUI)库。由于PyQt是Python与Qt的结合,所以它既可以利用Python强大而又简洁的语法和强大的生态,又不会丢失Qt强大的功能。从Python的角度来说,PyQt可以使用Python简洁、易用性的语法,提高开发效率;也可以使用Python的成熟生态,如数据分析、网络爬虫、人工智能等场景都可用PyQt开发GUI。从Qt的角度来说,由于PyQt完成了对Qt的所有类的封装,因此,PyQt可以使用Qt的所有生态开发出丰富的GUI程序。Qt生态中最方便的是Qt Designer(Qt设计师)这种代码生成器,它可以通过鼠标拖拽的方式快速度完成GUI设计,然后生成Python代码,对于初学者来说这是实现快速入门的最方便的工具。由于充分利用了双方的优点,所以我们用PyQt开发GUI会有一些意外收获,比如说有些程序逻辑在Qt中实现会比较复杂,而在PyQt中却很简单。

事实上PyQt是第三方提供的Qt for Python绑定,而Qt官方提供的Python绑定为PySide。PySide几经易手,在2016年才逐渐得到Qt官方的支持,第一个发布的版本在2018年,是基于Qt5.11的PySide2。对比PyQt5在2016年发布的第一个基于Qt5.6的版本。PyQt最早可以追溯到1998年的PyQt0.1,到PyQt1、PyQt2、PyQt3、PyQt4、PyQt5以及最新的PyQt6(截至2022年8月,最新版基于Qt6.3),并且实现了PyQt与Qt的同步更新。随着最近几年PySide2的逐渐完善我们有了除PyQt之外的另一个选择,在此之前基本只会选择PyQt。PySide和PyQt都是Qt对Python的绑定,两者绝大部分方法和用法都一样,两者之前的代码相互转换也非常容易,对于初学者来说随便选取一种学习即可。我们需要了解的是PySide/PyQt4是基于Qt4的绑定、PySide2/PyQt5基于Qt5、本书介绍的PySide6/PyQt6基于Qt6。不像Qt5对比Qt4的大版本改动,Qt6相对于Qt5变化很小。学习PySide6/PyQt6的好处是原来PySide2/PyQt5的绝大部分案例拿来就能用,少部分代码微调一下就能运行。因此,对于想要学习GUI的朋友来说,从PySide6/PyQt6开始是最好的选择。

本书《PySide6/PyQt6快速开发与实战》(简称《PySide6/PyQt6》)可以说是《PyQt5快速入门与实战》(简称《PyQt5》)的第二版。在编写《PyQt5》的时候,PySide2第一版还未发布,关于PyQt5的中文书籍还未上市,市面上仅有PyQt4的相关书籍。考虑到网络上关于PyQt5的学习案例知识点都非常零碎,对于新手来说想要入门PyQt5是非常痛苦的事情,解决这个问题是写作《PyQt5》的初衷。

令人欣慰的是,随着PyQt生态的发展和完善,关于PyQt5相关的资料开始变得丰富起来,有多本PyQt5相关书籍先后上市,对PyQt爱好者来说多了一些选择,这是非常好的一个事情。Qt涉及的知识点非常多,对于新手来说,最关心的问题可能是如何快速获取重要知识点以及快速掌握知识点的用法。比较遗憾的是,市面上的资料侧重点各有不同,都无法满足这个需求。当然,本书第一版《PyQt5》由于准备时间和水平都不足,有很大的缺陷,亦不能很好的满足这个需求。这些缺陷都会在本书第二版《PySide6/PyQt6》中完善,这就是《PySide6/PyQt6》写作的初衷。

《PySide6/PyQt6》既可以说是《PyQt5》的第二版,也可以说是一本新书。与《PyQt5》相比,《PySide6/PyQt6》重写了70%以上的内容,知识点增加了至少一倍,基本包含了新手学习PySide6/PyQt6所需掌握的绝大多数内容。《PySide6/PyQt6》的写作要比《PyQt5》辛苦很多,前后花费了有1年多的时间,这是一个非常吃力又不讨好的辛苦差事。之所以愿意吃这个苦完成本书写作,最主要原因是市场上确实缺少一本适合新手快速入门PySide6/PyQt6的资料,其次是《PyQt5》确实存在一些缺陷需要修复,再加上黄爱萍编辑多次诚恳邀请,笔者最终决定完成本书写作。

在本书开始写作的时候,PySide生态已经非常完善,尤其是PySide6的更新速度比PyQt6还要快,于是决定对PySide6/PyQt6都给予支持(会提供PySide6和PyQt6两套源代码),所以本书命名为《PySide6/PyQt6快速开发与实战》。经过笔者的不懈努力,对本书的最终结果还算满意。总的来说,本书的内容对得起本书的名称。你也可以把本书作为PySide6/PyQt6的小百科,因为PySide6/PyQt6涉及的绝大多数常用知识点在本书中都有涉及,且内容足够丰富。如果你想要快速入门PySide/PyQt,那么本书绝对可以满足你的需求;如果你有更高的需求,建议直接查阅Qt官方帮助文档,因为第三方资源可能满足不了你在细分领域的专业需求。

经过一年多的不懈努力,《PySide6/PyQt6》终于出版,希望本书能够帮助更多的朋友快速掌握PySide6/PyQt6开发技术,少走弯路,节约时间成本。在笔者最初接触PyQt的时候,查找各种资料非常痛苦,因此如何让更多的人减轻这种痛苦是我完成本书的最大动力,本书的出版就是要解决这个问题。本书若能帮助更多的朋友快速入门PySide6/PyQt6,是我莫大的荣幸。

本书目录

第1章 认识PySide 6/PyQt 6 ---------->>>>> 1

  • 1.1 PySide 6/PyQt 6框架简介 ---------->>>>> 1
    • 1.1.1 从GUI到PySide/PyQt ---------->>>>> 1
    • 1.1.2 PySide 6/PyQt 6的进展 ---------->>>>> 3
    • 1.1.3 PySide/PyQt相对于Qt的优势 ---------->>>>> 4
    • 1.1.4 PySide 6/PyQt 6与PySide 2/PyQt 5的关系 ---------->>>>> 5
    • 1.1.5 PyQt 5与PyQt 4 ---------->>>>> 6
    • 1.1.6 其他图形界面开发库 ---------->>>>> 7
  • 1.2 搭建PySide 6/PyQt 6环境 ---------->>>>> 7
    • 1.2.1 在Windows下使用PySide 6/PyQt 6环境 ---------->>>>> 8
    • 1.2.2 在Windows下自行搭建PySide 6/PyQt 6环境 ---------->>>>> 8
    • 1.2.3 在macOS和Linux下搭建PySide 6/PyQt 6环境 ---------->>>>> 14
    • 1.2.4 测试PySide 6/PyQt 6环境 ---------->>>>> 16
  • 1.3 PySide 6快捷工具简介 ---------->>>>> 16
    • 1.3.1 Qt Designer ---------->>>>> 17
    • 1.3.2 Qt用户交互编译器 ---------->>>>> 18
    • 1.3.3 Qt资源编译器 ---------->>>>> 18
    • 1.3.4 Qt帮助文档 ---------->>>>> 19
    • 1.3.5 Qt翻译器与其他 ---------->>>>> 19
    • 1.3.6 PyQt 6中的Qt工具 ---------->>>>> 20
  • 1.4 常用IDE的安装配置与使用 ---------->>>>> 21
    • 1.4.1 Eric 7的安装 ---------->>>>> 21
    • 1.4.2 Eric 7的相关配置 ---------->>>>> 23
    • 1.4.3 Eric 7的基本使用 ---------->>>>> 24
    • 1.4.4 PyCharm的安装 ---------->>>>> 28
    • 1.4.5 使用PyCharm搭建PySide 6/PyQt 6环境 ---------->>>>> 30
    • 1.4.6 PyCharm的基本使用 ---------->>>>> 32
    • 1.4.7 VSCode的安装 ---------->>>>> 35
    • 1.4.8 VSCode的配置 ---------->>>>> 36
    • 1.4.9 VSCode的基本使用 ---------->>>>> 37
  • 1.5 PySide/PyQt的启动方式 ---------->>>>> 40

第2章 Qt Designer的使用 ---------->>>>> 43

  • 2.1 Qt Designer快速入门 ---------->>>>> 43
    • 2.1.1 新建主窗口 ---------->>>>> 44
    • 2.1.2 窗口主要区域介绍 ---------->>>>> 45
    • 2.1.3 查看.ui文件 ---------->>>>> 47
    • 2.1.4 将.ui文件转换为.py文件 ---------->>>>> 49
    • 2.1.5 将.qrc文件转换为.py文件 ---------->>>>> 54
    • 2.1.6 界面与逻辑分离 ---------->>>>> 54
  • 2.2 布局管理入门 ---------->>>>> 55
    • 2.2.1 使用布局管理器进行布局 ---------->>>>> 56
    • 2.2.2 使用容器控件进行布局 ---------->>>>> 59
  • 2.3 Qt Designer实战应用 ---------->>>>> 60
    • 2.3.1 绝对布局 ---------->>>>> 61
    • 2.3.2 使用布局管理器进行布局 ---------->>>>> 63
    • 2.3.3 其他流程补充 ---------->>>>> 70
    • 2.3.4 测试程序 ---------->>>>> 73
  • 2.4 信号与槽关联 ---------->>>>> 75
    • 2.4.1 简单入门 ---------->>>>> 75
    • 2.4.2 获取信号与槽 ---------->>>>> 80
    • 2.4.3 使用信号/槽机制 ---------->>>>> 85
  • 2.5 菜单栏与工具栏 ---------->>>>> 85
    • 2.5.1 界面设计 ---------->>>>> 85
    • 2.5.2 效果测试 ---------->>>>> 90
  • 2.6 添加图片(资源文件) ---------->>>>> 92
    • 2.6.1 创建资源文件 ---------->>>>> 92
    • 2.6.2 添加资源文件 ---------->>>>> 93
    • 2.6.3 转换资源文件 ---------->>>>> 96
    • 2.6.4 效果测试 ---------->>>>> 97

第3章 基本窗口控件(上) ---------->>>>> 100

  • 3.1 主窗口(QMainWindow/QWidget/QDialog) ---------->>>>> 100
    • 3.1.1 窗口类型 ---------->>>>> 100
    • 3.1.2 创建主窗口 ---------->>>>> 102
      • 案例3-1 创建主窗口 ---------->>>>> 103
    • 3.1.3 移动主窗口 ---------->>>>> 106
    • 3.1.4 添加图标 ---------->>>>> 106
    • 3.1.5 显示状态栏 ---------->>>>> 107
    • 3.1.6 窗口坐标系统 ---------->>>>> 107
  • 3.2 标签(QLabel) ---------->>>>> 110
      • 案例3-2 QLabel标签的基本用法 ---------->>>>> 111
    • 3.2.1 对齐 ---------->>>>> 112
    • 3.2.2 设置颜色 ---------->>>>> 112
    • 3.2.3 显示HTML信息 ---------->>>>> 112
    • 3.2.4 滑动与单击事件 ---------->>>>> 112
    • 3.2.5 加载图片和气泡提示QToolTip ---------->>>>> 113
    • 3.2.6 使用快捷键 ---------->>>>> 114
      • 案例3-3 QLabel快捷键的基本用法 ---------->>>>> 114
  • 3.3 单行文本框(QLineEdit) ---------->>>>> 115
      • 案例3-4 QLineEdit的基本用法 ---------->>>>> 116
    • 3.3.1 对齐、tooltip和颜色设置 ---------->>>>> 117
    • 3.3.2 占位提示符、限制输入长度、限制编辑 ---------->>>>> 117
    • 3.3.3 移动指针 ---------->>>>> 118
    • 3.3.4 编辑 ---------->>>>> 119
    • 3.3.5 相关信号与槽 ---------->>>>> 119
    • 3.3.6 快捷键 ---------->>>>> 120
    • 3.3.7 隐私保护:回显模式 ---------->>>>> 121
      • 案例3-5 回显模式的显示效果 ---------->>>>> 121
    • 3.3.8 限制输入:验证器 ---------->>>>> 123
      • 案例3-6 QValidator验证器的使用方法 ---------->>>>> 123
    • 3.3.9 限制输入:掩码 ---------->>>>> 124
      • 案例3-7 输入掩码InputMask ---------->>>>> 125
  • 3.4 多行文本框(QTextEdit/QPlainTextEdit) ---------->>>>> 126
    • 3.4.1 QTextEdit ---------->>>>> 126
      • 案例3-8 QTextEdit控件的使用方法 ---------->>>>> 127
    • 3.4.2 QPlainTextEdit ---------->>>>> 129
      • 案例3-9 QPlainTextEdit控件的使用方法 ---------->>>>> 129
    • 3.4.3 快捷键 ---------->>>>> 130
    • 3.4.4 QSyntaxHighlighter ---------->>>>> 132
      • 案例3-10 QSyntaxHighlighter控件的使用方法 ---------->>>>> 132
    • 3.4.5 QTextBrowser ---------->>>>> 133
      • 案例3-11 QTextBrowser控件的使用方法 ---------->>>>> 134
  • 3.5 按钮类控件 ---------->>>>> 137
    • 3.5.1 QAbstractButton ---------->>>>> 137
    • 3.5.2 QPushButton ---------->>>>> 138
      • 案例3-12 QPushButton按钮的使用方法 ---------->>>>> 139
    • 3.5.3 QRadioButton、QGroupBox和QButtonGroup ---------->>>>> 141
      • 案例3-13 QRadioButton按钮的使用方法 ---------->>>>> 142
    • 3.5.4 QCheckBox ---------->>>>> 144
      • 案例3-14 QCheckBox按钮的使用方法 ---------->>>>> 145
    • 3.5.5 QCommandLinkButton ---------->>>>> 148
      • 案例3-15 QCommandLinkButton按钮的使用方法 ---------->>>>> 148
  • 3.6 工具按钮(QToolButton) ---------->>>>> 150
    • 案例3-16 QToolButton按钮的使用方法 ---------->>>>> 150
  • 3.7 下拉列表框(QComboBox) ---------->>>>> 156
      • 案例3-17 QComboBox按钮的使用方法 ---------->>>>> 157
    • 3.7.1 查询 ---------->>>>> 158
    • 3.7.2 增加 ---------->>>>> 159
    • 3.7.3 修改 ---------->>>>> 159
    • 3.7.4 删除 ---------->>>>> 161
    • 3.7.5 信号与槽函数 ---------->>>>> 161
    • 3.7.6 模型/视图框架 ---------->>>>> 163
    • 3.7.7 QFontComboBox ---------->>>>> 163
      • 案例3-18 QFontComboBox按钮的使用方法 ---------->>>>> 165
  • 3.8 微调框(QSpinBox/QDoubleSpinBox) ---------->>>>> 167
      • 案例3-19 QSpinBox控件的使用方法 ---------->>>>> 168
    • 3.8.1 步长和范围 ---------->>>>> 169
    • 3.8.2 循环 ---------->>>>> 169
    • 3.8.3 前缀、后缀与千位分隔符 ---------->>>>> 169
    • 3.8.4 特殊选择 ---------->>>>> 170
    • 3.8.5 信号与槽 ---------->>>>> 170
    • 3.8.6 自定义显示格式 ---------->>>>> 171
      • 案例3-20 QSpinBox控件的自定义格式显示 ---------->>>>> 171
      • 案例3-21 QDoubleSpinBox控件的使用方法 ---------->>>>> 172
  • 3.9 日期时间控件 ---------->>>>> 173
    • 3.9.1 日期时间相关控件 ---------->>>>> 173
    • 3.9.2 QDateTimeEdit、QDateEdit和QTimeEdit ---------->>>>> 174
      • 案例3-22 QDateTimeEdit控件的使用方法 ---------->>>>> 174
    • 3.9.3 QCalendarWidget ---------->>>>> 181
      • 案例3-23 QCalendarWidget控件的使用方法 ---------->>>>> 183
  • 3.10 滑动控件 ---------->>>>> 184
    • 3.10.1 QAbstractSlider ---------->>>>> 185
    • 3.10.2 QSlider ---------->>>>> 186
      • 案例3-24 QSlider控件的使用方法 ---------->>>>> 187
    • 3.10.3 QDial ---------->>>>> 188
      • 案例3-25 QDial控件的使用方法 ---------->>>>> 189
    • 3.10.4 QScrollBar ---------->>>>> 190
      • 案例3-26 QScrollBar控件的使用方法 ---------->>>>> 191
  • 3.11 区域滚动(QScrollArea) ---------->>>>> 193
    • 案例3-27 QScrollArea控件的使用方法 ---------->>>>> 194

第4章 基本窗口控件(下) ---------->>>>> 197

  • 4.1 对话框类控件(QDialog族) ---------->>>>> 197
    • 4.1.1 对话框简介 ---------->>>>> 198
    • 4.1.2 模式对话框 ---------->>>>> 198
    • 4.1.3 非模式对话框 ---------->>>>> 199
      • 案例4-1 QDialog控件的基本用法 ---------->>>>> 199
    • 4.1.4 扩展对话框 ---------->>>>> 204
      • 案例4-2 QDialog扩展对话框的使用方法 ---------->>>>> 204
    • 4.1.5 QMessageBox ---------->>>>> 206
      • 案例4-3 QMessageBox控件的使用方法 ---------->>>>> 207
    • 4.1.6 QInputDialog ---------->>>>> 212
      • 案例4-4 QInputDialog控件的使用方法 ---------->>>>> 213
    • 4.1.7 QFontDialog ---------->>>>> 215
      • 案例4-5 QFontDialog控件的使用方法 ---------->>>>> 215
    • 4.1.8 QFileDialog ---------->>>>> 217
      • 案例4-6 QFileDialog控件的使用方法 ---------->>>>> 217
    • 4.1.9 QColorDialog ---------->>>>> 222
      • 案例4-7 QColorDialog控件的使用方法 ---------->>>>> 223
    • 4.1.10 QProgressDialog和QProgressBar ---------->>>>> 225
      • 案例4-8 QProgressDialog控件和QProgressBar控件的使用方法 ---------->>>>> 226
    • 4.1.11 QDialogButtonBox ---------->>>>> 231
      • 案例4-9 QDialogButtonBox控件的使用方法 ---------->>>>> 233
  • 4.2 窗口绘图类控件 ---------->>>>> 236
    • 4.2.1 QPainter ---------->>>>> 236
      • 案例4-10 QPainter的简单用法 ---------->>>>> 239
    • 4.2.2 QBrush ---------->>>>> 241
      • 案例4-11 QBrush的使用方法 ---------->>>>> 244
    • 4.2.3 QPen ---------->>>>> 246
      • 案例4-12 QPen的使用方法 ---------->>>>> 248
    • 4.2.4 几个绘图案例 ---------->>>>> 250
      • 案例4-13 综合使用QPainter、QBrush和QPen的方法 ---------->>>>> 251
      • 案例4-14 QPainter的使用方法 ---------->>>>> 251
      • 案例4-15 QPainter实时绘图 ---------->>>>> 253
      • 案例4-16 绘制同心圆 ---------->>>>> 254
    • 4.2.5 QPixmap ---------->>>>> 255
    • 4.2.6 QImage ---------->>>>> 257
      • 案例4-17 QPixmap控件和QImage控件的使用方法 ---------->>>>> 263
  • 4.3 拖曳与剪贴板 ---------->>>>> 266
    • 4.3.1 QMimeData ---------->>>>> 267
      • 案例4-18 QMimeData控件的使用方法 ---------->>>>> 269
    • 4.3.2 Drag与Drop ---------->>>>> 271
      • 案例4-19 QDrag的使用方法1 ---------->>>>> 272
      • 案例4-20 QDrag的使用方法2 ---------->>>>> 276
    • 4.3.3 QClipboard ---------->>>>> 280
      • 案例4-21 QClipboard控件的使用方法 ---------->>>>> 281
  • 4.4 菜单栏、工具栏、状态栏与快捷键 ---------->>>>> 283
    • 4.4.1 菜单栏QMenu ---------->>>>> 284
      • 案例4-22 QMenuBar、QMenu和QAction的使用方法 ---------->>>>> 284
    • 4.4.2 快捷键QKeySequence(Edit)、QShortcut ---------->>>>> 288
      • 案例4-23 QShortcut的使用方法 ---------->>>>> 292
      • 案例4-24 QKeySequenceEdit的使用方法 ---------->>>>> 293
    • 4.4.3 工具栏QToolBar ---------->>>>> 296
      • 案例4-25 QToolBar的使用方法 ---------->>>>> 296
    • 4.4.4 QStatusBar ---------->>>>> 300
      • 案例4-26 QStatusBar控件的使用方法 ---------->>>>> 300
  • 4.5 其他控件 ---------->>>>> 303
    • 4.5.1 QFrame ---------->>>>> 303
      • 案例4-27 QFrame的使用方法 ---------->>>>> 305
    • 4.5.2 QLCDNumber ---------->>>>> 307
      • 案例4-28 QLCDNumber的使用方法 ---------->>>>> 307

第5章 表格与树 ---------->>>>> 310

  • 5.1 QListWidget ---------->>>>> 310
    • 5.1.1 增/删项目 ---------->>>>> 311
    • 5.1.2 选择 ---------->>>>> 311
    • 5.1.3 外观 ---------->>>>> 313
    • 5.1.4 工具、状态、帮助提示 ---------->>>>> 313
    • 5.1.5 信号与槽 ---------->>>>> 313
    • 5.1.6 上下文菜单 ---------->>>>> 314
      • 案例5-1 QListWidget控件的使用方法 ---------->>>>> 314
  • 5.2 QTableWidget ---------->>>>> 323
    • 5.2.1 创建 ---------->>>>> 323
    • 5.2.2 基于item的操作 ---------->>>>> 324
    • 5.2.3 基于行列的操作 ---------->>>>> 324
    • 5.2.4 导航 ---------->>>>> 324
    • 5.2.5 表头(标题) ---------->>>>> 325
    • 5.2.6 自定义小部件 ---------->>>>> 325
    • 5.2.7 调整行/列的大小 ---------->>>>> 326
    • 5.2.8 拉伸填充剩余空间 ---------->>>>> 327
    • 5.2.9 坐标系 ---------->>>>> 327
    • 5.2.10 信号与槽 ---------->>>>> 327
    • 5.2.11 上下文菜单 ---------->>>>> 328
      • 案例5-2 QTableWidget控件的使用方法 ---------->>>>> 328
  • 5.3 QTreeWidget ---------->>>>> 335
    • 案例5-3 QTreeWidget控件的使用方法 ---------->>>>> 338
  • 5.4 模型/视图/委托框架 ---------->>>>> 339
    • 5.4.1 模型 ---------->>>>> 339
    • 5.4.2 视图 ---------->>>>> 342
    • 5.4.3 委托 ---------->>>>> 342
  • 5.5 QListView ---------->>>>> 343
    • 5.5.1 绑定模型和初始化数据 ---------->>>>> 344
    • 5.5.2 增、删、改、查、移 ---------->>>>> 344
    • 5.5.3 列表视图布局 ---------->>>>> 344
    • 5.5.4 其他要点 ---------->>>>> 346
      • 案例5-4 QListView结合QStringListModel的使用方法 ---------->>>>> 346
  • 5.6 QTableView ---------->>>>> 350
    • 5.6.1 绑定模型和初始化数据 ---------->>>>> 351
    • 5.6.2 模型(QStandardItemModel)的相关函数 ---------->>>>> 351
    • 5.6.3 视图(QTableView)的相关函数 ---------->>>>> 352
    • 5.6.4 表头(标题,QHeaderView)的相关函数 ---------->>>>> 353
    • 5.6.5 上下文菜单 ---------->>>>> 355
      • 案例5-5 QTableView结合QStandardItemModel的使用方法 ---------->>>>> 355
  • 5.7 QTreeView ---------->>>>> 362
    • 案例5-6 QTreeView控件结合QStandardItemModel模型的使用方法 ---------->>>>> 365
    • 案例5-7 QTreeView和QFileSystemModel的使用方法 ---------->>>>> 366
  • 5.8 自定义模型 ---------->>>>> 367
    • 案例5-8 QTableView控件结合自定义模型的使用方法 ---------->>>>> 368
  • 5.9 自定义委托 ---------->>>>> 374
    • 案例5-9 QTableView控件结合自定义委托的使用方法 ---------->>>>> 374
  • 5.10 Qt数据库 ---------->>>>> 381
    • 5.10.1 Qt SQL简介 ---------->>>>> 381
    • 5.10.2 连接数据库 ---------->>>>> 382
    • 5.10.3 执行SQL语句 ---------->>>>> 386
      • 案例5-10 数据库的创建 ---------->>>>> 387
    • 5.10.4 数据库模型 ---------->>>>> 389
    • 5.10.5 数据库模型与视图的结合 ---------->>>>> 393
      • 案例5-11 QSqlQueryModel分页视图查询 ---------->>>>> 395
      • 案例5-12 QSqlTableModel排序过滤表 ---------->>>>> 399
      • 案例5-13 QSqlRelationalTableModel关系表单 ---------->>>>> 403
    • 5.10.6 数据感知表单 ---------->>>>> 406
      • 案例5-14 QDataWidgetMapper数据感知表单 ---------->>>>> 407
    • 5.10.7 自定义模型与委托 ---------->>>>> 409
      • 案例5-15 数据库自定义模型+委托案例 ---------->>>>> 409

第6章 高级窗口控件 ---------->>>>> 413

  • 6.1 窗口风格 ---------->>>>> 413
    • 6.1.1 设置窗口风格 ---------->>>>> 413
    • 6.1.2 设置窗口样式 ---------->>>>> 414
    • 6.1.3 设置窗口背景 ---------->>>>> 415
    • 6.1.4 设置窗口透明 ---------->>>>> 418
      • 案例6-1 WinStyle案例 ---------->>>>> 418
  • 6.2 布局管理 ---------->>>>> 420
    • 6.2.1 布局管理的基础知识 ---------->>>>> 420
    • 6.2.2 Q(V/H)BoxLayout ---------->>>>> 423
      • 案例6-2 QBoxLayout的使用方法 ---------->>>>> 425
    • 6.2.3 QGridLayout ---------->>>>> 428
      • 案例6-3 QGridLayout的使用方法 ---------->>>>> 429
    • 6.2.4 QFormLayout ---------->>>>> 431
      • 案例6-4 QFormLayout的使用方法 ---------->>>>> 433
    • 6.2.5 QStackedLayout ---------->>>>> 434
      • 案例6-5 QStackedLayout的使用方法 ---------->>>>> 435
      • 案例6-6 QLayout布局管理的使用方法 ---------->>>>> 436
    • 6.2.6 QSplitter ---------->>>>> 439
      • 案例6-7 QSplitter控件的使用方法 ---------->>>>> 440
  • 6.3 容器:装载更多的控件 ---------->>>>> 443
    • 6.3.1 QTabWidget ---------->>>>> 443
      • 案例6-8 QTabWidget的使用方法 ---------->>>>> 444
    • 6.3.2 QStackedWidget ---------->>>>> 446
      • 案例6-9 QStackedWidget控件的使用方法 ---------->>>>> 446
    • 6.3.3 QToolBox ---------->>>>> 449
      • 案例6-10 QToolBox的使用方法 ---------->>>>> 450
    • 6.3.4 QDockWidget ---------->>>>> 451
      • 案例6-11 QDockWidget控件的使用方法1 ---------->>>>> 452
      • 案例6-12 QDockWidget控件的使用方法2 ---------->>>>> 455
    • 6.3.5 多文档界面QMdiArea和QMdiSubWindow ---------->>>>> 455
      • 案例6-13 QMdiArea控件和QMdiSubWindow控件的使用方法1 ---------->>>>> 459
      • 案例6-14 QMdiArea控件和QMdiSubWindow控件的使用方法2 ---------->>>>> 463
    • 6.3.6 QAxWidget ---------->>>>> 464
      • 案例6-15 QAxWidget的使用方法 ---------->>>>> 465
  • 6.4 多线程 ---------->>>>> 469
    • 6.4.1 QTimer ---------->>>>> 469
      • 案例6-16 QTimer的使用方法 ---------->>>>> 470
    • 6.4.2 QThread ---------->>>>> 472
      • 案例6-17 QThread的使用方法 ---------->>>>> 474
    • 6.4.3 事件处理 ---------->>>>> 477
  • 6.5 网页交互 ---------->>>>> 479
    • 6.5.1 加载内容 ---------->>>>> 479
    • 6.5.2 标题和图标 ---------->>>>> 479
    • 6.5.3 QWebEnginePage的相关方法 ---------->>>>> 479
    • 6.5.4 运行JavaScript函数 ---------->>>>> 482
      • 案例6-18 基于QWebEngineView实现基本的Web浏览功能 ---------->>>>> 483
  • 6.6 QSS的UI美化 ---------->>>>> 486
    • 6.6.1 QSS的基本语法规则 ---------->>>>> 486
    • 6.6.2 QSS选择器的类型 ---------->>>>> 488
    • 6.6.3 QSS子控件 ---------->>>>> 489
    • 6.6.4 QSS伪状态 ---------->>>>> 489
    • 6.6.5 颜色冲突与解决方法 ---------->>>>> 490
    • 6.6.6 继承与多样 ---------->>>>> 491
    • 6.6.7 Qt Designer与样式表 ---------->>>>> 492
      • 案例6-19 QSS的使用方法 ---------->>>>> 493
    • 6.6.8 QDarkStyleSheet ---------->>>>> 497
      • 案例6-20 QDarkStyle的使用方法 ---------->>>>> 497
  • 6.7 QML浅议 ---------->>>>> 498
    • 6.7.1 QML的基本概念 ---------->>>>> 498
    • 6.7.2 QML与JavaScript ---------->>>>> 498
    • 6.7.3 在Python中调用QML ---------->>>>> 499
      • 案例6-21 在Python中调用QML ---------->>>>> 499
      • 案例6-22 将Python对象暴露给QML:上下文属性 ---------->>>>> 500
      • 案例6-23 将Python对象暴露给QML:注册类型 ---------->>>>> 502
      • 案例6-24 QML调用Python模型 ---------->>>>> 504
      • 案例6-25 在QML中调用Python属性的方法 ---------->>>>> 507

第7章 信号/槽和事件 ---------->>>>> 511

  • 7.1 信号与槽的简介 ---------->>>>> 511
    • 7.1.1 基本介绍 ---------->>>>> 511
    • 7.1.2 创建信号 ---------->>>>> 513
    • 7.1.3 操作信号 ---------->>>>> 513
    • 7.1.4 槽函数 ---------->>>>> 514
  • 7.2 信号与槽的案例 ---------->>>>> 514
      • 案例7-1 信号与槽的使用方法 ---------->>>>> 515
    • 7.2.1 内置信号+内置槽函数 ---------->>>>> 515
    • 7.2.2 内置信号+自定义槽函数 ---------->>>>> 517
    • 7.2.3 自定义信号+内置槽函数 ---------->>>>> 517
    • 7.2.4 自定义信号+自定义槽函数 ---------->>>>> 518
    • 7.2.5 断开信号与槽连接 ---------->>>>> 518
    • 7.2.6 恢复信号与槽连接 ---------->>>>> 519
    • 7.2.7 装饰器信号与槽连接 ---------->>>>> 521
    • 7.2.8 多线程信号与槽连接 ---------->>>>> 522
  • 7.3 信号与槽的参数 ---------->>>>> 523
      • 案例7-2 信号与槽的参数 ---------->>>>> 523
    • 7.3.1 内置信号+默认参数 ---------->>>>> 524
    • 7.3.2 自定义信号+默认参数 ---------->>>>> 524
    • 7.3.3 内置信号+自定义参数lambda ---------->>>>> 525
    • 7.3.4 内置信号+自定义参数partial ---------->>>>> 526
    • 7.3.5 自定义信号+自定义参数lambda ---------->>>>> 527
    • 7.3.6 自定义信号+自定义参数partial ---------->>>>> 528
  • 7.4 基于Qt Designer的信号与槽 ---------->>>>> 529
    • 案例7-3 基于Qt Designer的信号与槽的使用方法 ---------->>>>> 530
  • 7.5 事件处理机制 ---------->>>>> 532
    • 7.5.1 事件处理机制和信号/槽机制的区别 ---------->>>>> 533
    • 7.5.2 常见事件类型 ---------->>>>> 533
    • 7.5.3 使用事件处理的方法 ---------->>>>> 536
    • 7.5.4 经典案例分析 ---------->>>>> 537
      • 案例7-4 事件处理机制的方法1和方法2 ---------->>>>> 537
      • 案例7-5 事件处理机制的方法3 ---------->>>>> 543
      • 案例7-6 事件处理机制的方法4 ---------->>>>> 546

第8章 Python的扩展应用 ---------->>>>> 547

  • 8.1 使用PyInstaller打包项目生成.exe文件 ---------->>>>> 547
    • 8.1.1 安装PyInstaller ---------->>>>> 547
    • 8.1.2 PyInstaller的用法与参数 ---------->>>>> 548
    • 8.1.3 PyInstaller案例 ---------->>>>> 550
  • 8.2 Pandas在PySide/PyQt中的应用 ---------->>>>> 552
    • 8.2.1 qtpandas模块库的安装 ---------->>>>> 552
    • 8.2.2 官方案例解读 ---------->>>>> 553
    • 8.2.3 设置提升的窗口部件 ---------->>>>> 555
    • 8.2.4 qtpandas的使用 ---------->>>>> 557
  • 8.3 Matplotlib在PyQt中的应用 ---------->>>>> 559
    • 8.3.1 对MatplotlibWidget的解读 ---------->>>>> 560
    • 8.3.2 设置提升的窗口部件 ---------->>>>> 563
    • 8.3.3 MatplotlibWidget的使用 ---------->>>>> 564
    • 8.3.4 更多扩展 ---------->>>>> 565
  • 8.4 PyQtGraph在PyQt中的应用 ---------->>>>> 566
    • 8.4.1 PyQtGraph的安装 ---------->>>>> 567
    • 8.4.2 官方案例解读 ---------->>>>> 567
    • 8.4.3 设置提升的窗口部件 ---------->>>>> 569
    • 8.4.4 PyQtGraph的使用 ---------->>>>> 569
    • 8.4.5 更多扩展 ---------->>>>> 573
  • 8.5 Plotly在PyQt中的应用 ---------->>>>> 573
    • 8.5.1 Plotly的安装 ---------->>>>> 574
    • 8.5.2 案例解读 ---------->>>>> 574
    • 8.5.3 设置提升的窗口部件 ---------->>>>> 575
    • 8.5.4 Plotly的使用 ---------->>>>> 576
    • 8.5.5 Plotly的更多扩展 ---------->>>>> 579
    • 8.5.6 Dash的使用 ---------->>>>> 579
    • 8.5.7 Dash的更多扩展 ---------->>>>> 583

第9章 实战应用 ---------->>>>> 584

  • 9.1 在量化投资中的应用 ---------->>>>> 584
  • 9.2 在券商投研中的应用 ---------->>>>> 593
    • 9.2.1 从爬虫说起 ---------->>>>> 594
    • 9.2.2 程序解读 ---------->>>>> 595

附录 ---------->>>>> 618

  • 附录A Qt for Python代码转换 ---------->>>>> 618
  • 附录B C++ to Python代码转换 ---------->>>>> 624
  • 附录C 本书一些通用枚举表格目录 ---------->>>>> 630
  • 附录D 优秀PySide/PyQt开源项目推荐 ---------->>>>> 631