1. PyQt开发环境搭建
1.1 Python安装
点击链接直接下载Python3.10版本:https://www.python.org/ftp/python/3.10.4/python-3.10.4-amd64.exe
下载太慢?微信搜索“五维星空”,发送“python安装包”获取网盘下载地址。
下载后双击启动安装程序即可(记得勾选add to path)。
1.2 PyQt5安装
打开cmd
执行pip3 install pyqt5
。
又慢?换源大法送上。如下命令是替换为中科大的源。
pip install pip -U #升级 pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple/ #换源
1.3 Qtdesigner安装
这个东西主要是用来设计界面的,没错,就是拖拽控件生成界面,之后执行命令将其转换成Python代码。(喜欢手敲的大佬可以跳过这个工具,over~)
点击链接直接下载Qtdesigner Windows版本:https://build-system.fman.io/static/public/files/Qt%20Designer%20Setup.exe
下载后双击启动安装程序即可。
2. PyQt开发基础
2.1 第一个程序——HelloWorld
基础不牢、语法不会?**问题不大。毛主席都说了,实践是检验真理的唯一标准。**来写一个HelloWorld吧
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == '__main__':
# 创建APP
app = QtWidgets.QApplication(sys.argv)
# 创建窗体
mainFrame = QtWidgets.QWidget()
# 设置窗体大小
mainFrame.resize(800, 200)
# 设置窗体标题
mainFrame.setWindowTitle("HelloWorld")
# 将Label组件绑定到mainFrame上,并设置内容
labelHello = QtWidgets.QLabel(mainFrame)
labelHello.setText("Hello World!By 五维星空~")
# 设置字体
font = QtGui.QFont()
# 字体加粗
font.setBold(True)
# 字体大小
font.setPixelSize(26)
labelHello.setFont(font)
# 计算Label的合适大小并返回QSize对象
size = labelHello.sizeHint()
# 设置labelHello的坐标以及宽高
labelHello.setGeometry(250, 100, size.width(), size.height())
# 运行时显示对话框
mainFrame.show()
# 启动应用程序
sys.exit(app.exec_())
运行结果:
2.2 使用QtDesigner设计窗体
在2.1节我们一起写了一个简单的HelloWorld
程序(没搞懂?问题不大,后面敲着敲着就懂了😉),本节我们使用QtDesigner
来做同样的事情。在此之前,我们先通过下面这幅图简单了解一下QtDesigner
的界面。
好了,接下来正式开始本节的内容。
-
打开QtDesigner,按照下图创建程序。
-
找到windowTitle属性,输入窗口标题
-
找到Label组件,拖拽至窗体位置
-
双击进入编辑模式,输入
HelloWorld! By 五维星空~
,调整至合适大小。 -
在右侧对象浏览器中选中label,之后在属性编辑器中找到font属性,选择合适的字体(咳咳,商用注意小心字体侵权~),设置字体大小后记得调整Label大小。
可以商用的字体(口水话安排上🤔:搜索结果来自互联网,“五维星空”不对该结果的准确性负责~):
-
思源字体,可以免费商用的有:思源黑体,思源宋体,思源柔黑体。
-
方正字体,方正类字体可以免费商用的有:方正仿宋(简,繁),方正黑体(简,繁),方正楷体( 简繁),方正书宋(简,繁)。
-
…
-
-
额,忘了调整窗体大小,补上补上~
-
调整Label大小
-
Ctrl+S
保存生成helloWorld.ui
文件即可。 -
在
helloWorld.ui
文件目录下打开cmd,输入pyuic5 -o ui_HelloWorld.py helloWorld.ui
回车后生成python
文件。pyuic5是PyQt5的工具软件,在1.2小节安装PyQt5的时候它已经安装在
D:\Software\Python310\Scripts
路径下(注意这是我本地的路径,你的路径应该是你的Python安装位置。)常见问题:
-
pyuic5
报命令不存在?小老弟,是不是忘了加环境变量?添加之后记得重启
cmd
窗口。
2.3 使用QtDesigner设计的界面
在2.1节我们使用QtDesigner生成了一个HelloWorld程序并将它转换成了python代码,本节我们来学习如何使用这份代码。是不是有小伙伴已经运行代码了发现无事发生?😄不要慌,我们接着往下看。我们先简单了解一下这份文件的内容。
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'helloWorld.ui' # # Created by: PyQt5 UI code generator 5.15.6 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): '''注意,此处继承的是object对象而不是QWidget对象''' def setupUi(self, Form): '''设置ui的函数,Form为程序最外层的组件容器对象''' Form.setObjectName("Form") # 设置Form对象名称 Form.resize(800, 200) # 设置大小 self.label = QtWidgets.QLabel(Form) # 在Form上定义一个Label self.label.setGeometry(QtCore.QRect(250, 100, 420, 35)) # 定义Label位置 font = QtGui.QFont() # 定义字体 font.setFamily("楷体") font.setPointSize(26) font.setBold(True) font.setWeight(75) self.label.setFont(font) # 设置Label字体 self.label.setTextFormat(QtCore.Qt.AutoText) # 格式化处理 self.label.setObjectName("label") # 设置Label对象名称 self.retranslateUi(Form) # 自定义方法 QtCore.QMetaObject.connectSlotsByName(Form) # 通过名称关联信号与插槽 def retranslateUi(self, Form): '''设置Form的UI属性''' _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "HelloWorld")) self.label.setText(_translate("Form", "HelloWorld! By 五维星空~"))
怎么样?是不是跟咱们手写的代码很类似,里面关于信号与插槽部分后面章节会讲,大家只需要大致了解这份文件的风格即可(QtDesigner会有一个继承object的类进行了ui的一些设置)。
常见的有三种方式使用这份代码文件。
-
方式一:直接法(不推荐)
import sys from PyQt5 import QtCore, QtGui, QtWidgets from ui_HelloWorld import Ui_Form if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) container = QtWidgets.QWidget() form = Ui_Form() form.setupUi(container) # 将最外层组件容器对象传入 container.show() sys.exit(app.exec_())
缺点:耦合性太高。
-
方式2:多继承(不推荐)
import sys from PyQt5.QtWidgets import QApplication, QWidget from ui_HelloWorld import Ui_Form class MyWidget(QWidget, Ui_Form): """多继承""" def __init__(self): # 在多继承时,super()的得到的是第一个基类,在此处就是QWidget。 super().__init__() # 调用父类构造函数,创建窗体。 self.labTip = "多继承" # 新定义一个变量 self.setupUi(self) # 将当前类(QWidget的子类)传入 self.label.setText(self.labTip) # 设置label内容 if __name__ == '__main__': app = QApplication(sys.argv) container = MyWidget() container.show() sys.exit(app.exec_())
缺点:MyWidget自己的属性和Ui_Form的属性混在一起了,不易区分。
-
方式3:单继承(推荐)
import sys from PyQt5.QtWidgets import QApplication, QWidget from ui_HelloWorld import Ui_Form class MyWidget(QWidget): """单继承""" def __init__(self, parent=None): super().__init__(parent) # 调用父类构造函数,创建窗体 self.__ui = Ui_Form() # 创建ui对象 self.__ui.setupUi(self) # 设置父窗体 self.labTip = "单继承" # 自定义属性 self.__ui.label.setText(self.labTip) # 设置ui内的属性 if __name__ == '__main__': app = QApplication(sys.argv) container = MyWidget() container.show() sys.exit(app.exec_())
优点:MyWidget自己的属性和Ui_Form的属性易区分。
字体显示有问题的小伙伴,请将ui转的python文件中的
font.setPointSize(26)
改为font.setPixelSize(26)
。QtDesigner中没有setPixelSize属性,应该是QtDesigner和python版本不一致问题导致的吧,具体原因没有深究,有兴趣的小伙伴可以评论区讨论哦。 -