参考资料
https://doc.itprojects.cn/0001.zhishi/python.0008.pyqt5rumen/index.html
1 下载安装PyQT5
1.1 创建新的虚拟环境
为方便PyQT5程序打包,可新建虚拟环境
conda create -n your_env_name python=x.x
1.2 安装PyQT5
pip install pyqt5
1.3 检测代码
# 如果执行成功,没有任何错误提示,则表明环境搭建成功
from PyQt5 import QtWidgets
# 查看PyQt版本
from PyQt5.QtCore import *
print(QT_VERSION_STR)
2 第一个PyQt程序
# -*- coding: UTF-8 -*-
# 导入需要的包
from PyQt5.Qt import *
import sys
# 创建应用程序对象
app = QApplication(sys.argv)
# 控件操作
window = QWidget()
window.setWindowTitle("123")
window.resize(500, 500)
window.move(400, 200)
label = QLabel(window)
label.setText("Hello World")
label.move(200, 200)
window.show()
# 开始执行应用程序,并进入消息循环
sys.exit(app.exec_())
3 按钮控件 QPushButton
"""
=============================================
Time :
Auther :
File :
Function : 控件 QPushButton
=============================================
"""
import sys
from PyQt5.QtWidgets import *
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PYQT程序")
# 在窗口里面添加控件
btn = QPushButton('按钮')
# 设置按钮的父亲是当前窗口,等于是添加到窗口中显示
btn.setParent(w)
# 展示窗口
w.show()
# 程序运行循环等待状态
app.exec()
4 文本控件 QLabel
"""
=============================================
Time :
Auther :
File :
Function : 控件 QLabel
=============================================
"""
import sys
from PyQt5.QtWidgets import *
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PYQT程序")
# # 下面创建一个Label,然后调用方法指定父类
# label = QLabel("账号")
# # 设置父对象
# label.setParent(w)
# 下面创建一个Label(纯文本),在创建的时候指定了父对象
label = QLabel("账号", w)
# 显示位置与大小: x,y,w,h
label.setGeometry(20, 20, 30, 30)
# 展示窗口
w.show()
# 程序运行循环等待状态
app.exec()
5 文本框控件 QLineEdit
"""
=============================================
Time :
Auther :
File :
Function : 文本框控件 QLineEdit
=============================================
"""
import sys
from PyQt5.QtWidgets import *
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PYQT程序")
# 纯文本
label = QLabel("账号", w)
label.setGeometry(20, 20, 30, 20)
# 文本框
edit = QLineEdit(w)
edit.setPlaceholderText("请输入账号")
edit.setGeometry(50, 20, 200, 20)
# 在窗口里面添加控件
btn = QPushButton('注册', w)
btn.setGeometry(50, 80, 70, 30)
# 展示窗口
w.show()
# 程序运行循环等待状态
app.exec()
6 调整窗口的大小和位置
"""
=============================================
Time :
Auther :
File :
Function : 调整窗口的大小和位置
=============================================
"""
import sys
from PyQt5.QtWidgets import *
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PYQT程序")
# 窗口的大小
w.resize(300, 200)
# 将窗口设置在屏幕的左上角
# w.move(0, 0)
# 调整窗口在屏幕中央显示
center_pointer = QDesktopWidget().availableGeometry().center()
x = center_pointer.x()
y = center_pointer.y()
# w.move(x, y)
# w.move(x-150, y-150)
print(w.frameGeometry())
print(w.frameGeometry().getRect())
print(type(w.frameGeometry().getRect()))
old_x, old_y, width, height = w.frameGeometry().getRect()
w.move(int(x-width/2), int(y-height/2))
# 展示窗口
w.show()
# 程序运行循环等待状态
app.exec()
7 设置窗口图标
可以下载icon图标网站:
https://www.easyicon.cc/
https://www.iconfont.cn/
"""
=============================================
Time :
Auther :
File :
Function : 设置窗口图标
=============================================
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PYQT程序")
# 设置图标
w.setWindowIcon(QIcon('棒棒糖.png'))
# 展示窗口
w.show()
# 程序运行循环等待状态
app.exec()
8 垂直布局 BoxLayout
"""
=============================================
Time :
Auther :
File :
Function : 垂直布局
=============================================
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import warnings
warnings.filterwarnings("ignore", category = DeprecationWarning)
class MyWindow(QWidget):
def __init__(self):
# 切记一定要调用父类的__init__方法,因为它里面有很多对UI空间的初始化操作
super().__init__()
# 设置大小
self.resize(300, 300)
# 设置标题
self.setWindowTitle("垂直布局")
# 垂直布局
layout = QVBoxLayout()
# 作用是在布局器中增加一个伸缩量,里面的参数表示QSpacerItem的个数,默认值为零
# 会将你放在layout中的空间压缩成默认的大小
# 下面的比试 1:1:1:2
# layout.addStretch(1)
# 按钮1
btn1 = QPushButton("按钮1")
# 添加到布局器中
# layout.addWidget(btn1, Qt.AlignmentFlag.AlignTop)
layout.addWidget(btn1)
# 按钮2
btn2 = QPushButton("按钮2")
# 添加到布局器中
layout.addWidget(btn2)
# 按钮3
btn3 = QPushButton("按钮3")
# 添加到布局器中
layout.addWidget(btn3)
# 添加一个伸缩器(理解为一个弹簧)
# layout.addStretch()
# 让当前的窗口使用这个排列的规则(布局器)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建一个QWidget子类
w = MyWindow()
w.show()
app.exec()
9 水平布局 BoxLayout
"""
=============================================
Time :
Auther :
File :
Function : 水平布局
=============================================
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import warnings
warnings.filterwarnings("ignore", category = DeprecationWarning)
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 最外层的垂直布局,包含两部分:爱好和性别
container = QVBoxLayout()
# 创建第一个组,添加多个组件
# hobby 主要是保证他们是一个组
hobby_box = QGroupBox("爱好")
# v_layout 保证三个爱好是垂直摆放
v_layout = QVBoxLayout()
btn1 = QRadioButton("抽烟")
btn2 = QRadioButton("喝酒")
btn3 = QRadioButton("烫头")
# 添加到v_layout中
v_layout.addWidget(btn1)
v_layout.addWidget(btn2)
v_layout.addWidget(btn3)
# 把v_layout添加到hobby_box中
hobby_box.setLayout(v_layout)
# 创建第二个组,添加多个组件
# gender 主要是保证他们是一个组
gender_box = QGroupBox("性别")
# v_layout 保证三个爱好是垂直摆放
h_layout = QHBoxLayout()
btn4 = QRadioButton("男")
btn5 = QRadioButton("女")
# 添加到v_layout中
h_layout.addWidget(btn4)
h_layout.addWidget(btn5)
# 把h_layout添加到gender_box中
gender_box.setLayout(h_layout)
# 把爱好的内容添加到容器中
container.addWidget(hobby_box)
# 把爱好的内容添加到容器中
container.addWidget(gender_box)
# 设置窗口显示的内容是最外层容器
self.setLayout(container)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
10 布局器 GridLayout
"""
=============================================
Time :
Auther :
File :
Function : 布局器·九宫格
=============================================
"""
import sys
from PyQt5.QtWidgets import *
import warnings
warnings.filterwarnings("ignore", category = DeprecationWarning)
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("计算器")
# 准备数据
data = {
0: ["7", "8", "9", "+", "("],
1: ["4", "5", "9", "+", ")"],
2: ["7", "8", "9", "+", "("],
3: ["7", "8", "9", "+", "("]
}
# 整体垂直布局
layout = QVBoxLayout()
# 输入框
edit = QLineEdit()
edit.setPlaceholderText("请输入内容")
# 把输入框添加到容器中
layout.addWidget(edit)
# 网格布局
grid = QGridLayout()
# 循环创建追加进去
for line_number, line_data in data.items():
# 此时line_number是第几行,line_data是当前行的数据
for col_number, number in enumerate(line_data):
# 此时col_number,是第几列,number是要显示的符号
btn = QPushButton(number)
# grid.addWidget(btn)
grid.addWidget(btn, line_number, col_number)
# 把网格布局追加到容器中
layout.addLayout(grid)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
11 布局器3 FormLayout
TODO
12 布局器4 StackedLayout
抽屉布局
"""
=============================================
Time :
Auther :
File :
Function : 布局器4 StackedLayout
=============================================
"""
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Window1(QWidget):
def __init__(self):
super().__init__()
QLabel("我是抽屉一要显示的内容", self)
self.setStyleSheet("background-color:green;")
class Window2(QWidget):
def __init__(self):
super().__init__()
QLabel("我是抽屉二要显示的内容", self)
self.setStyleSheet("background-color:red;")
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.create_stacked_layout()
self.init_ui()
def create_stacked_layout(self):
# 创建堆叠(抽屉)布局
self.stacked_layout = QStackedLayout()
# 创建单独的Widget
win1 = Window1()
win2 = Window2()
# 将创建的2个Widget添加到抽屉布局器中
self.stacked_layout.addWidget(win1)
self.stacked_layout.addWidget(win2)
def init_ui(self):
# 设置Widget大小以及固定高度
self.setFixedSize(300, 200)
# 1.创建整体的布局器
container = QVBoxLayout()
# 2.创建1个要显示具体内容的子Widget
widget = QWidget()
widget.setLayout(self.stacked_layout)
widget.setStyleSheet("background-color:gray;")
# 3.创建2个按钮,用来点击进行切换抽屉布局器中的Widget
btn_press1 = QPushButton("抽屉一")
btn_press2 = QPushButton("抽屉二")
# 给按钮添加事件(点击后要调用的函数)
btn_press1.clicked.connect(self.btn_press1_clicked)
btn_press2.clicked.connect(self.btn_press2_clicked)
# 将需要展示的空间添加到布局器中
container.addWidget(widget)
container.addWidget(btn_press1)
container.addWidget(btn_press2)
# 5.设置当前要显示的Widget,从而能够显示这个布局器中的控件
self.setLayout(container)
def btn_press1_clicked(self):
# 设置抽屉布局器的当前索引值。即可切换显示哪个widget
self.stacked_layout.setCurrentIndex(0)
def btn_press2_clicked(self):
# 设置抽屉布局器的当前索引值。即可切换显示哪个widget
self.stacked_layout.setCurrentIndex(1)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
app.exec()
13 信号与槽
14 Qt Designer
"""
=============================================
Time :
Auther :
File :
Function : 动态加载UI文件
=============================================
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = uic.loadUi("untitled.ui")
# 展示窗口
ui.show()
app.exec()