Python开发GUI常用库PyQt6 和 PySide6 介绍系列,已发表的:
之一:简介与安装https://blog.csdn.net/cnds123/article/details/135069944
之二:设计师(Designer)https://blog.csdn.net/cnds123/article/details/135101580
之三:交互和通信方式讲解 https://blog.csdn.net/cnds123/article/details/135190542
对于较小的GUI界面程序,如果界面相对简单,不涉及复杂的布局和控件设置,不用Qt Designer(Qt 设计师)直接在代码中创建和布局控件可能更为方便和快捷。
当涉及到使用 PyQt6 或 PySide6 进行图形用户界面 (GUI) 开发时,不使用Qt Designer时的一般的使用步骤:
1)首先,确保已经安装了 PyQt6 或 PySide6 库。
2)导入模块:在代码中导入所需的模块。
☆导入整个库:
对于PySide6
from PySide6 import QtCore, QtGui, QtWidgets
对于PyQt6
from PyQt6 import QtCore, QtGui, QtWidgets
这种方式会导入整个PySide6或PyQt6库,并使你可以使用其提供的所有模块、类和函数。你可以通过模块名称来访问库中的各种Widget(小部件)。
☆导入特定模块或类:
对于PySide6,例如
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
对于PyQt6,例如
from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel
这种方式只导入了你需要使用的特定模块或类。这样可以减少导入的内容,并使代码更具可读性。
3)创建应用程序对象:创建一个 QApplication 实例。这是你的 GUI 应用程序的主要入口点。
app = QApplication([])
4)创建主窗口:创建一个 QMainWindow 实例作为主窗口。你可以添加其他控件和布局来构建你的界面。
window = QMainWindow()
5)创建控件并添加到窗口:创建你需要的各种Widget(小部件)件,例如 QLabel、QPushButton 等,并将它们添加到主窗口中。
label = QLabel("Hello World!", window)
window.setCentralWidget(label)
6)显示窗口:通过调用 show() 方法来显示主窗口。
window.show()
7)运行应用程序:通过调用 app.exec() 方法来运行应用程序的事件循环,使应用程序保持运行状态。
app.exec()
提示:Widget(小部件)是Qt中可视化的用户界面元素,也有人称为组件或控件,是Qt中QWidget类的实例。它可以是窗口、按钮、标签、文本框、复选框等等。Widget可以用于创建用户界面的各种元素,以响应用户的输入和显示相关的信息。
PySide6是由Qt公司(The Qt Company)开发和支持的。PySide6是Qt官方推荐的Python绑定库,由Qt公司提供支持。它与Qt框架紧密集成,具有与Qt C++版本的高度兼容性。
PyQt6是由Riverbank Computing开发和支持的。它由Riverbank Computing开发和支持,提供了与Qt C++版本相似的功能和API,并且与Qt官方的兼容性很高。
【当软件开发者提到"Qt"时,它可以指两个不同的事物:Qt指The Qt Company,也指Qt开发框架:
1、Qt公司(The Qt Company):这是一家软件公司,主要负责开发和维护Qt开发框架。Qt公司提供商业许可和支持服务,并积极推动Qt的发展和创新。
2、Qt开发框架:这是由Qt公司开发的跨平台的应用程序和用户界面开发框架。Qt开发框架提供了丰富的工具、类库和API,使开发人员能够以一致的方式构建高效、现代和可扩展的应用程序。
当软件开发者提到"Qt"时,需要根据上下文来确定是指Qt公司还是Qt开发框架。】
源码如下:
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建一个按钮
self.button = QPushButton("Click me", self)
self.button.move(100, 100) #move方法来设置其位置,两个参数:横坐标和纵坐标
# 将按钮的点击信号连接到我们定义的槽函数
self.button.clicked.connect(self.on_button_clicked)
# 当按钮被点击时,这个槽函数会被调用
def on_button_clicked(self):
message_box = QMessageBox()
message_box.setText("Button was clicked!") # 创建一个消息框并显示消息
message_box.exec()
app = QApplication([])
window = MainWindow()
window.setWindowTitle("PySide6示例")
window.setGeometry(300, 300, 400, 300)
window.show()
app.exec()
运行效果如下
对于上面这个简单的例子,若想改用PyQt6实现,将PySide6替换为PyQt6,即可。你可以试试在此就不给出源码和演示效果了。
先给出效果图:
下面给出源码:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
from PySide6.QtCore import Qt, QTimer, QPointF, QRectF
from PySide6.QtGui import QPainter, QColor, QFont, QPen, QBrush
import random
import math
class Particle:
def __init__(self, x, y, color):
self.x = x
self.y = y
self.color = color
self.radius = random.randint(2, 4)
self.angle = random.uniform(0, 2 * math.pi)
self.speed = random.uniform(1, 3)
self.gravity = 0.1
def move(self):
self.x += math.cos(self.angle) * self.speed
self.y += math.sin(self.angle) * self.speed + self.gravity
self.radius -= 0.1 # 粒子逐渐变小
def draw(self, painter):
painter.setPen(Qt.NoPen)
painter.setBrush(QColor(*self.color))
painter.drawEllipse(QPointF(self.x, self.y), self.radius, self.radius)
class Firework:
def __init__(self, x, y):
self.x = x
self.y = y
self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
self.particles = []
self.exploded = False
self.explode_height = random.randint(100, 400) # 设置爆炸高度
self.speed = random.randint(5, 10) # 设置上升速度
self.angle = math.pi / 2 # 设置上升角度为垂直向上
def launch(self):
if not self.exploded:
self.y -= self.speed * math.sin(self.angle)
if self.y <= self.explode_height: # 到达设定高度后爆炸
self.explode()
self.exploded = True
def explode(self):
for _ in range(100): # 爆炸产生的粒子数量
self.particles.append(Particle(self.x, self.y, self.color))
def draw(self, painter):
if not self.exploded:
painter.setPen(QPen(Qt.NoPen))
painter.setBrush(QColor(*self.color))
painter.drawEllipse(QPointF(self.x, self.y), 5, 5)
else:
for particle in self.particles:
particle.move()
particle.draw(painter)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Fireworks")
self.setFixedSize(800, 600)
self.fireworks = []
self.timer = QTimer()
self.timer.timeout.connect(self.updateFireworks)
self.timer.start(30) # 控制帧率
def updateFireworks(self):
if random.randint(1, 20) == 1: # 控制烟花发射频率
self.fireworks.append(Firework(random.randint(0, self.width()), self.height()))
self.update()
def paintEvent(self, event):
painter = QPainter(self)
painter.fillRect(self.rect(), Qt.black)
font = QFont("simsun", 36)
painter.setFont(font)
painter.setPen(QPen(Qt.red))
painter.drawText(self.rect(), Qt.AlignCenter, "2024龙年快乐")
for firework in self.fireworks[:]:
firework.launch()
firework.draw(painter)
if firework.exploded and all(p.radius <= 0 for p in firework.particles):
self.fireworks.remove(firework)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
下面是一个PySide6实现一个简单的记事本,文件菜单包括:打开、保存、清除、关闭。
先给出效果图:
源码如下:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog
from PySide6.QtGui import QAction, QIcon
class NotepadWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("记事本")
self.setWindowIcon(QIcon("notepad-icon.png"))
self.text_edit = QTextEdit()
self.setCentralWidget(self.text_edit)
self.create_menu()
self.resize(400, 300) #设置窗体的宽度和高度(单位像素)
def create_menu(self):
menu = self.menuBar()
file_menu = menu.addMenu("文件")
# 打开文件
open_action = QAction(QIcon("open-icon.png"), "打开", self)
open_action.setShortcut("Ctrl+O")
open_action.triggered.connect(self.open_file)
file_menu.addAction(open_action)
# 保存文件
save_action = QAction(QIcon("save-icon.png"), "保存", self)
save_action.setShortcut("Ctrl+S")
save_action.triggered.connect(self.save_file)
file_menu.addAction(save_action)
#清文本内容除
clear_action = QAction(QIcon("clear-icon.png"), "清除", self)
clear_action.setShortcut("Ctrl+Shift+C")
clear_action.triggered.connect(self.clear_text)
file_menu.addAction(clear_action)
# 关闭窗口
close_action = QAction("关闭", self)
close_action.setShortcut("Ctrl+Q")
close_action.triggered.connect(self.close)
file_menu.addAction(close_action)
def open_file(self):
file_dialog = QFileDialog(self)
file_dialog.setNameFilter("Text Files (*.txt)")
if file_dialog.exec() == QFileDialog.Accepted:
file_path = file_dialog.selectedFiles()[0]
with open(file_path, "r",encoding="utf-8") as file:
content = file.read()
self.text_edit.setPlainText(content)
def save_file(self):
file_dialog = QFileDialog(self)
file_dialog.setDefaultSuffix("txt")
file_dialog.setNameFilter("Text Files (*.txt)")
if file_dialog.exec() == QFileDialog.Accepted:
file_path = file_dialog.selectedFiles()[0]
content = self.text_edit.toPlainText()
with open(file_path, "w", encoding="utf-8") as file:
file.write(content)
def clear_text(self):
self.text_edit.clear()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = NotepadWindow()
window.show()
sys.exit(app.exec())
注意,其中的“encoding="utf-8"”,在大多数情况下,默认的编码方式是根据你的操作系统的默认编码来确定的。如果你不确定文件的实际编码方式,可以尝试使用一些常见的编码方式(如 utf-8、gbk、utf-16 等)进行尝试,以找到正确的编码方式。
顺便说明,代码中假设已经有名为notepad-icon.png、open-icon.png、save-icon.png和clear-icon.png的图标文件可以在当前工作目录下找到,即和代码文件保存在同一目录中,你可以将对应的图标文件替换为你自己的图标文件,若不能或不想供图标文件,可以将代码中self.setWindowIcon(QIcon("notepad-icon.png"))和类似QAction(QIcon("open-icon.png"), "打开", self) 语句中的“QIcon("open-icon.png"),” 部分删除,不删除也不报错,只是运行时不显示图标而已。
附录、PyQt6 vs PySide6 - 这两个Python Qt库之间有什么区别?https://juejin.cn/post/7166899345185308702