一个属于自己的空白的pyside6项目模板demo,可以用作项目的起步框架。
主目录结构
各个目录和文件的说明:
DataBase:数据库相关文件
Job:作业函数,是用来实现具体功能的函数,比如用于文字识别,或者用于PLC项目的scada等等。
Settings:设置文件
tmp:临时文件
UI:用户交互界面文件
main.py:主程序,作为项目的启动入口,并在主程序中运行QT的主循环。
创建一个通用的基本界面文件
在UI目录下使用QT desinger创建一个ui文件,命名为:base_form.ui。视项目需求,选择QMainWindow(自带菜单栏和信息栏)或者不带菜单栏和信息栏的QWidget。
界面的层次关系和主要构成如下:
为了方便进行样式管理,界面中的主要容器,无论选择哪种窗口作为基本界面,form_base、form_main、form_top这些都用固定的名称,这样就可以在一个样式表文件中设置所有的共同显示特性。
创建项目实体
创建一个项目实体(QObject),用来管理和协调各个画面以及各种变量、信号、操控、反馈等。对于本项目而言,这个项目实体的直系成员都是全局成员。这样,通过这个项目实体,就很容易在各个画面和功能作业函数之间进行数据交互。
# 这里定义项目级别的信号和变量、参数等
import json
import os
import sqlite3
import time
from PySide6.QtCore import Signal, QObject, QTimer, Slot, Qt
from PySide6.QtSql import QSqlDatabase
# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建上一级目录的路径
parent_dir = os.path.dirname(current_dir)
# 构建数据库路径
db_file_path = os.path.join(parent_dir, "DataBase", "project_db.db")
# 定义全局的ui项目类
class UiProj(QObject):
# 在这里定义全局信号
proj_signal_1 = Signal() # 一个全局信号示例
def __init__(self):
super(UiProj, self).__init__()
self.run()
def run(self):
self.slot_signal() # 连接全局的信号和槽函数
# 信号和槽函数
def slot_signal(self):
# 全局的一个槽函数示例
@Slot()
def slot_1():
print("全局信号的槽函数1")
self.proj_signal_1.connect(slot_1) # 连接信号和槽函数,尽可能使槽函数和信号连接成对出现,方便管理。
uiproj = UiProj() # 生成全局的ui项目对象
编程主程序 main.py
# -*- coding: utf-8 -*-
import os
import sys
from PySide6.QtWidgets import QApplication
# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 基础数据库
db_base = "QSQLITE"
# 数据库文件路径
db_file_path = "DB_proj/project_db.db"
def main():
pass
if __name__ == "__main__":
app = QApplication(sys.argv) # 创建一个QApplication对象
main() # 执行main函数
sys.exit(app.exec()) # 退出程序
app.exec()是QT的主循环,用于处理事件、更新界面等操作,确保程序能够持续响应各种交互和事件。关于它的详细理解见:PyQt和PySide中,主函数app=QApplication(sys.argv) sys.exit(app.exec_())的理解_app = qapplication(sys.argv)-CSDN博客
添加一个新的画面
• 在UI目录下新建Python包(其实就是包含__init__.py的文件夹),命名为UI_forms,用来存放所有的画面。在UI_forms目录下,每个画面的各种类型的文件都放在同一个该画面同名的文件夹下。
• 在UI_forms目录下新建main_window文件夹,把base_form.ui复制到这个文件夹下,并重命名为main_window.ui。
• 使用uic工具将main_window.ui转换为main_window.py,这个就是main_window这个画面的前端代码,这个代码不用编辑,当需要修改前端画面时,在designer内修改,并使用uic工具重新生成即可。这样做的好处是所有的画面布局都是可视化的,特别适合从WINCC、组态王之类的界面软件转过来的朋友。
• 在main_window文件夹内新建python文件:main_window_ffunc.py。这个就是main_window这个画面的后台代码,画面所有的交互逻辑和信号、变量传递全部在这里实现,彻底实现了前后端分离。
# main_window画面(主画面的后端功能函数)
from PySide6.QtCore import Slot, Qt
from PySide6.QtWidgets import QWidget, QApplication, QPushButton, QMessageBox
from . import main_window # 导入使用uic工具生成的spy文件
from UI.ui_project import uiproj # 导入全局的ui项目对象
# 定义窗口类
class FormMainWindow(QWidget, main_window.Ui_form_base):
def __init__(self):
super().__init__()
self.setupUi(self) # 加载窗口
self.run() # 实例化以后的初始化运行窗口 Ui_MainWindow
# 初始化运行窗口
def run(self):
pass
修改UI包内的__init__.py文件
# __all__的内容决定了from xxx import *时,哪些内容被导入
from . main_window.main_window_func import FormMainWindow
__all__ = ['FormMainWindow']
把新画面添加进主程序
修改main.py:
# -*- coding: utf-8 -*-
import os
import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication
from UI.ui_project import uiproj # 导入全局的ui项目对象
from UI.UI_forms import * # 导入所有窗口
# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 基础数据库
db_base = "QSQLITE"
# 数据库文件路径
db_file_path = "DB_proj/project_db.db"
def main():
uiproj.forms = [] # 项目的所有窗口列表
# 定义一个添加窗口的函数
def add_form(form, frameLess=True, tophint=False, show=False):
"""
添加窗口
:param form: 被添加的窗口实例
:param frameLess: 是否无边框
:param tophint: 是否置顶
:param show: 是否显示
:return: None
"""
uiproj.forms.append(uiproj.form_main_window ) # 将窗口添加到项目的窗口列表中
if frameLess:
form.setWindowFlag(Qt.FramelessWindowHint) # 设置窗口无边框
if tophint:
form.setWindowFlag(Qt.WindowStaysOnTopHint) # 设置窗口置顶
form.show() # 先显示窗口,以便完成窗口的所有初始化工作
if not show:
form.hide() # 隐藏窗口
# 添加所有的窗口
def add_forms():
"""
添加所有窗口
:return:
"""
uiproj.form_main_window = FormMainWindow() # 实例化主窗口
add_form(uiproj.form_main_window, tophint=True, show=True) # 添加主窗口到项目的窗口列表中
add_forms() # 添加所有窗口
if __name__ == "__main__":
app = QApplication(sys.argv) # 创建一个QApplication对象
main() # 执行main函数
sys.exit(app.exec()) # 结束主循环后退出程序
至此就完成了一个基本的pyside6项目模板。