brujah 发表于 2020-6-8 18:47

[python]PyQt5基础与实际应用(二)模块讲解和布局管理

本帖最后由 wushaominkk 于 2020-6-18 17:46 编辑



# 前言

很久以前就想静下心来写一些自己感兴趣的小项目,希望能沉淀一下自己这些年所掌握的知识。事实上独立开发者在国内一直很难做起来,但能拥有一款独立产品我觉得可能是大部分开发者会引以为豪的事情。本系列严格意义上来讲不算是教程,只是记录自己在开发这个系列的所思所考,过程会尽可能详细记录,但我认为过于基础的东西并不会深入讲解。项目涉及到的源码会在文章底部放出。

# 工欲善其事必先利其器

- Qt Designer:不知道是什么的返回上一章好好看看
- 已安装 Python3.8.2 的 Windows 10 电脑:性能不用太好,能看岛国动作影视作品就行
- PyCharm 2020.1.1 (Professional Edition):有钱的用正版,没钱的用社区版,没脸没皮的用破解版
- 一个能访问 Baidu/Google 的浏览器
- Python 官方文档地址(现已加入豪华中文大餐):(https://docs.python.org/zh-cn/3/)
- PyQt5 官方文档地址(整站不超过26个字母):(https://doc.qt.io/qtforpython/index.html)

# 模块讲解

|名称   |释义   |
| :------------: | :------------: |
|Qt Core|Qt Core模块包含核心类,包括事件循环以及Qt的信号和插槽机制。它还包括针对动画,状态机,线程,映射文件,共享内存,正则表达式以及用户和应用程序设置的独立于平台的抽象。|
|Qt Gui|Qt Gui模块包含用于窗口系统集成,事件处理,2D图形,基本图像,字体和文本的类。它还包含一套完整的OpenGL和OpenGL ES绑定(请参阅对OpenGL的支持)。应用程序开发人员通常将其与更高级别的API配合使用,例如Qt Widgets模块中包含的API。|
|Qt Widgets|Qt Widgets模块包含提供一组UI元素的类,以创建经典的桌面样式用户界面。|
|Enginio|该Enginio模块包含了实现客户端库访问Qt的云服务托管应用程序运行时类。该模块已弃用。相应的C ++库不再是Qt的一部分。|
|Qt AxContainer|该模块仅在Windows上可用。Qt AxContainer模块包含允许访问ActiveX控件和COM对象的类。它不支持用Python编写ActiveX服务器的功能。|
|Qt|Qt模块将大多数其它模块的内容合并为一个模块。(不包括Qt3D,图表,数据可视化和购买模块)。这样的好处是,您不必担心哪个基础模块包含特定的类。它的缺点是它将加载整个Qt框架,从而显著增加应用程序的内存占用。无论您使用此合并模块,还是使用单个组件模块,都取决于个人喜好。|
|Qt 3D Animation|Qt 3D Animation模块增加了对指定和使用可应用于模拟对象属性的动画的支持。|
|Qt 3D Core|Qt 3D Core模块包含核心类,以支持用于2D和3D渲染的近实时仿真系统。|
|Qt 3D Extras|Qt 3D Extras模块包含许多与Qt 3D一起使用的预建元素(材料,网格,几何形状,相机控制器等)。|
|Qt 3D Input|Qt 3D Input模块包含用于处理使用Qt 3D的应用程序中的用户输入的类。|
|Qt 3D Logic|Qt 3D Logic模块包含一些类,以使帧与Qt 3D后端同步。|
|Qt 3D Render|Qt 3D Render模块包含显示,组件和其他实现2D和3D渲染作为Qt 3D的一部分所必需的支持类型。|
|Qt Android Extras|该模块仅在Android上可用。Qt Android Extras模块包含特定于Android的其他类。仅实现QAndroidJniObject类的子集。特别是只能调用callMethod()和callStaticMethod()方法来调用Java类上的方法。另外,只能调用不带参数且返回int的Java方法。这将有用性限制在您可以控制Java API的Java类中,并且可以在设计时考虑这些限制。|
|Qt Bluetooth|Qt Bluetooth模块包含支持蓝牙设备之间的连接的类。蓝牙是一种短距离(小于100米)无线技术。它具有2.1 Mbit/s的相当高的数据传输速率,非常适合在设备之间传输数据。蓝牙连接基于基本的设备管理,例如扫描设备,收集有关设备的信息以及在设备之间交换数据。|
|Qt Chart|Qt Chart模块提供了一组易于使用的图表组件。 图表类型包括折线图和曲线图,分区图和散点图,柱状图,饼图,箱线图,k线图和极坐标图。|
|Qt DBus|Qt DBus模块包含支持D-Bus协议的类。D-Bus是一种进程间通信(IPC)和远程过程调用(RPC)机制,最初是为Linux开发的,目的是用一个统一协议代替现有的和竞争的IPC解决方案。它也被设计为允许系统级进程(例如打印机和硬件驱动程序服务)与普通用户进程之间的通信。|
|Qt DataVisualization|Qt DataVisualization模块提供了一种将3D数据可视化为条形图,散点图和平面图的方法。对于可视化深度图和大量快速变化的数据(例如从多个传感器接收的数据)特别有用。可以通过使用主题或向主题添加自定义项目和标签来自定义图形的外观。|
|Qt Designer|Qt Designer模块包含允许使用Python扩展Qt Designer的类。有关如何执行此操作的完整说明,请参见编写Qt Designer插件。|
|Qt Help|Qt Help模块包含使开发人员能够在其应用程序中包含在线帮助和文档的类。|
|Qt Location|Qt Location模块包含用于访问地理编码和导航信息以及地点搜索的类。它允许使用一些流行的定位服务提供的数据来创建地图解决方案。|
|Qt Mac Extras|该模块仅在iOS和macOS上可用。Qt Mac Extras模块包含特定于iOS和macOS的其它类。|
|Qt Multimedia|Qt Multimedia模块包含用于处理多媒体内容的类和用于访问相机和收发消息的API。|
|Qt Multimedia Widgets|Qt Multimedia Widgets模块包含提供其他与多媒体相关的窗口小部件和控件的类。这些类扩展了Qt Multimedia和Qt Widgets模块的功能。|
|Qt Network|Qt Network模块包含用于编写UDP和TCP客户端和服务器的类。它包括实现HTTP客户端并支持DNS查找的类。|
|Qt Network Auth|Qt Network Auth模块包含支持网络授权(OAuth)的类。|
|Qt Nfc|Qt Nfc模块包含在支持NFC的设备之间提供连接的类。NFC API提供了用于与NFC标签平台和NFC平台设备进行交互的API,包括目标检测和丢失,注册NDEF消息处理程序,在NFC标签平台上读写NDEF消息以及发送特定于标签的命令。|
|Qt OpenGL|Qt OpenGL模块包含允许在基于Qt Widgets的应用程序中渲染3D图形时使用OpenGL的类。该模块已弃用。应该改用QtGui中的OpenGL类。|
|Qt Positioning|Qt Positioning模块包含用于通过使用各种可能的来源(包括卫星或wifi或文本文件等)确定位置的类。然后可以将该信息用于确定地图上的位置。另外,可以检索卫星信息并且可以执行基于区域的监视。|
|Qt PrintSupport|Qt PrintSupport模块包含允许应用程序打印到本地连接的和远程打印机的类。它还可以生成PostScript和PDF文件。|
|Qt Purchasing|Qt Purchasing模块包含支持应用程序内购买的类。目前,它支持在macOS上的Mac App Store,iOS上的App Store和Android上的Google Play进行的购买。|
|Qt Qml|Qt Qml模块包含一些类,以允许应用程序集成对QML和JavaScript的支持。Python对象可以导出到QML或从QML创建,其方式与Qt允许C ++实例相同。有关如何执行此操作的完整说明,请参见集成Python和QML。|
|Qt Quick|Qt Quick模块包含的类提供了使用QML创建用户界面所必需的基本元素。|
|Qt Quick 3D|Qt Quick 3D模块提供了一个高级API,用于基于Qt Quick创建3D内容或UI。它没有使用产生同步问题和其他抽象层的外部引擎,而是提供了对现有Qt Quick场景图(用于空间内容)的扩展,以及对该扩展场景图的渲染器。使用空间场景图时,还可以将Qt Quick 2D内容与3D内容混合。|
|Qt Quick Widgets|Qt Quick Widgets模块包含支持在传统小部件中显示QML场景的类。|
|Qt Remote Objects|Qt Remote Objects模块包含一些类,这些类实现了进程间通信机制,以在不同进程之间共享QObject的API(即其属性,信号和插槽)。这些进程可能在不同的系统上运行。在对象副本(称为副本)上调用的插槽将转发到真实对象(称为源)以进行处理。对源的更新(属性更改或发出的信号)将转发到每个副本。副本是源对象的轻量级代{过}{滤}理,但它支持QObjects的相同连接和行为,这使得它与任何其他本地实现的QObject一样容易使用。副本看起来像源对象所需的一切都在后台处理。在Qt中,可以静态或动态定义QObject的API。在.rep文件中指定了静态定义,然后使用repc实用程序将其转换为C ++代码。然后,将编译C ++代码并将其与应用程序的其余部分链接。PyQt5不支持静态定义。动态定义使用常规编写的QObject。然后进行自省以确定要共享的API。复制器不需要知道作为源一部分的原始定义。换句话说,Python客户端应用程序不需要导入包含QObject定义的Python服务器应用程序的模块。Python客户端可以与C ++服务器进行交互(服务器使用静态还是动态定义)。Python服务器可以与C ++客户端进行交互。但是,如果C ++客户端是使用静态定义编写的,则Python服务器必须确保QObject的QMetaObject与.rep文件中定义的匹配。在大多数情况下,这意味着属性,信号和插槽以相同的顺序出现。|
|Qt Sensors|Qt Sensors模块包含用于访问系统硬件传感器的类,这些传感器包括加速度计,高度计,环境光和温度传感器,陀螺仪和磁力计。|
|Qt SerialPort|Qt SerialPort模块包含支持基本功能的类,这些类包括配置,I/O操作,获取和设置RS-232引脚排列的控制信号。|
|Qt Sql|Qt Sql模块包含与SQL数据库集成的类。 它包括可与GUI类一起使用的数据库表的可编辑数据模型。 它还包括SQLite的实现。|
|Qt Svg|Qt Svg模块包含用于呈现结构化矢量图形(SVG)文件内容的类。|
|Qt Test|Qt Test模块包含启用PyQt5应用程序的单元测试的功能。(PyQt5没有实现完整的Qt单元测试框架。相反,它假定将使用标准的Python单元测试框架,并实现了模拟用户与GUI交互的功能。)另外,QSignalSpy类可轻松内省Qt的信号和插槽。|
|Qt WebChannel|Qt WebChannel模块包含一些类,这些类支持在服务器(QML/Python应用程序)和客户端(HTML/JavaScript或QML应用程序)之间进行对等通信。Qt WebEngine开箱即用地支持它。此外,它可以在所有支持WebSocket的浏览器上运行,从而使WebChannel客户端可以在任何JavaScript环境(包括QML)中运行。这需要基于Qt WebSockets的自定义传输的实现。|
|Qt WebEngine|Qt WebEngine模块包含一些类,这些类将在QML中创建的Web引擎对象的更多功能公开给Python。|
|Qt WebEngineCore|Qt WebEngineCore模块包含其他Web Engine模块使用的核心类。|
|Qt WebEngineWidgets|Qt WebEngineWidgets模块包含用于基于Chromium的Web浏览器实现的类。这取代了QtWebKit模块,并为HTML,CSS和JavaScript功能提供了更好的最新支持。 但是,它也会消耗更多资源,并且无法通过Python API直接访问网络堆栈和HTML文档。注意:Qt WebEngineWidgets通常在Windows下使用低于v3.5的Python版本时不可用,因为编译器不兼容。|
|Qt WebKit|Qt WebKit模块包含实现基于WebKit2的Web浏览器的类。该模块已弃用。相应的C ++库不再是Qt的一部分。|
|Qt WebKitWidgets|Qt WebKitWidgets模块包含实现基于WebKit1的Web浏览器的类,这些类可在基于Qt Widgets的应用程序中使用。该模块已弃用。相应的C ++库不再是Qt的一部分。|
|Qt WebSockets|Qt WebSockets模块包含实现RFC 6455中描述的WebSocket协议的类。|
|Qt Win Extras|该模块仅在Windows上可用。Qt Win Extras模块包含特定于Windows的其他类,例如,提供对跳转列表的访问,任务栏按钮上的进度指示器和缩略图工具栏。|
|Qt X11 Extras|该模块仅在X11上可用。Qt X11 Extras模块包含特定于X11的其他类。|
|Qt Xml|Qt Xml模块包含一些类,这些类实现了Qt的XML解析器的SAX和DOM接口。|
|Qt XmlPatterns|Qt XmlPatterns模块包含提供对XPath,XQuery,XSLT和XML Schema验证的支持的类。|
|sip|sip模块的主要目的是提供所有SIP生成的绑定所共有的功能。它是自动加载的,大多数时候您将完全忽略它。但是,它确实提供了一些可由应用程序使用的功能。|
|uic|uic模块包含用于处理Qt Designer创建的.ui文件的类,它们描述了图形用户界面的全部或一部分。它包括加载.ui文件并直接呈现的类,以及从.ui文件生成Python代码以供以后执行的类。|

# 基础布局

## 布局分类

布局主要为绝对布局和使用 `layout`布局。

### 绝对布局

绝对定位是指程序猿在添加组件时指定每一个部件的位置和尺寸,一般情况下是设置以` 上、下、左、右 `和` 宽、高 `等属性的像素值,你屏幕的左上角为` 0, 0 `。
它存在以下几个缺点:
- 改变窗口大小时,窗口中的部件大小和位置不会随之改变。
- 在不同的平台上,应用程序可能会看起来不尽相同。
- 在应用程序中改变字体可能会导致布局混乱。
- 如果你打算改变窗口布局,你就必须得重新书写所有部件的布局,这一工作会非常乏味且耗时较多。

让我们尝试一下,在上次的` Learn_PyQt `项目文件夹下新建一个` absolute_location `的 py 文件,键入下面的代码来实现一个简单的登录窗口:



运行一下,是不是看到一个比癞蛤蟆还粗糙的登录窗口?是的,要想利用绝对布局完成一个精美的界面是很困难的一件事,除非你的眼睛是像素级的,并且为了解决上述的问题,你需要编写大量的代码。

但绝对布局并不是一无是处,在构建更为复杂的界面时,我们可以在局部通过计算的相对值来为不多的组件进行布局,毕竟这要简单的多。

### 线性垂直布局 QVBoxLayout

线性垂直布局顾名思义就是将多个控件从上到下依次垂直的摆放,让我们再新建一个` qvbox_layout `的 py 文件,键入下面的代码来重新实现登录窗口:



让我们分析一下,这段代码做了什么,首先我们创建出了我们所需要的所有组件,然后我们又创建了一个垂直布局,把所有组件都放在了这个垂直布局当中,最后我们把这个垂直布局又放进了主窗口的布局当中,因为我们没有针对布局和组件设置任何值,所以默认组件全部铺满整个垂直布局,而垂直布局则铺满整个窗口。



这仍然不是我们刚才想要的,这时候就要讲到下一个布局了。

### 混合线性水平布局 QHBoxLayout

和垂直布局一样,只是水平布局是水平也就是横向的布局。在 Qt 中,布局是可以叠加或嵌套的,让我们再新建一个` login `的 py 文件,键入下面的代码来再次优化登录窗口:



在上面的代码中,我们实现了垂直布局和水平布局的混合使用,先将名称和密码的` Lable `和` LineEdit `各放在一个水平布局中,让它们保持横向排列。然后将` PushButton `单独放在一个水平布局中,接着我需要这三个水平布局垂直排列,所以将三个水平布局放置在一个垂直布局中,运行一下看看效果:



尽管我们实现了这个效果,但有没有更简单的方式呢?

### 表单布局 QFormLayout

表单布局可以将控件以两列的形式进行排布,左列控件为文本标签,右列为输入型的控件,如` QLineEdit `。用这个布局管理器我们可以更加快速方便地构写有表单的界面。我们用` QFormLayout `来改写下上面的代码:



### 网格布局 QGridLayout

到目前为止,我们掌握的几种布局已经可以应对大部分简单的布局了,那应付相对复杂的布局我们应该怎么办呢?答案是网格布局。网格布局可以把整个窗口切割成等块的矩阵,你只需要将相应的控件放在不同坐标的位置就可以:



值得一提的是你可以为每个控件指定行和列的位置。也可以跳过元素,它们将保留为空,并不需要填写网格中的所有位置。



让我们再新建一个` grid_layout `的 py 文件,键入下面的代码来重新实现登录窗口:



## 总结

Qt的布局方式分为两种:
绝对定位:
- widget.move(int x, int y)

布局管理器:
- 线性垂直布局 QVBoxLayout
- 线性水平布局 QHBoxLayout
- 表单布局 QFormLayout:layout.addRow(widget, widget)
- 网格布局 QGridLayout:addWidget(widget, int row, int column,int rowSpan, int columnSpan)

1. 布局可以叠加或嵌套;
2. addWidget()方法用来添加控件,addLayout()方法用来添加布局;
3. 自定义布局需要放在窗口布局中才能生效。

布局是GUI套件中最复杂也是最容易发挥想法的部分,一篇文章肯定讲不完,这里仅作为入门,以后有机会讲讲高级布局和窗体美化。

上一课:

(https://www.52pojie.cn/thread-1194240-1-1.html "PyQt5基础与实际应用(一)环境搭建")



天域至尊 发表于 2021-1-5 10:41

爽歪歪,终于找到志同道合的兄弟了,推荐GUI编辑器,eric6{:301_997:}

安装:
pip install eric-ide
使用命令
eric6

qiaopf888 发表于 2021-8-5 10:21

希望可以出一个反编译或者po解 的教程,我用了一个基于QT3,或者QT4的应用 正好向修改一些内容

mayl8822 发表于 2020-6-8 19:12

上一课怎么删除了

brujah 发表于 2020-6-8 19:14

mayl8822 发表于 2020-6-8 19:12
上一课怎么删除了

没删除啊,我这边一点就可以跳过去...

沐雨红尘 发表于 2020-6-8 21:29

处女-大龙猫 发表于 2020-6-8 21:37

收藏 , 遇到不会的好翻出来看

zxl7725103 发表于 2020-6-24 09:02

学习ing,楼主快点更新!!

1768133393 发表于 2020-7-29 03:46

谢谢楼主!!!

wdbyd 发表于 2020-8-3 21:48

谢谢分享,正找呢

wdbyd 发表于 2020-8-3 21:49

代码开起来比界面还好看。。。。。

wdbyd 发表于 2020-8-3 22:27

附件的解压缩密码是什么?谢谢
页: [1] 2
查看完整版本: [python]PyQt5基础与实际应用(二)模块讲解和布局管理