【Pyside6】桌面应用--目录、代码结构设计(附案例)

简介: 【Pyside6】桌面应用--目录、代码结构设计(附案例)

目录设计的必要性


1、每个目录层次有自己的独立的职责,具备不同的功能,协同合作成就一个项目。

2、随着功能模块的增多、代码的逻辑的复杂性增强,模块之间的耦合性问题逐渐显露。良好的目录设计可以有效防止模块的混乱,也能做好对功能模块的快速定位。这对于开发人员来讲是尤其重要的。

3、随着时间的推移,后期再回过头来对项目进行维护时,清晰的目录结构可以让我们快速理清思路、关键定位。


代码结构设计的必要性


1、对于长期的维护,代码设计比可不少。他决定了代码整体开发风格和编写形式。

2、增加可读性、可维护性。松耦合、划分层次。

3、使功能模块更容易理解,代码质量、扩展性更好。


案例(以登录、注册、主界面为例。)


项目演示


Pyside6-登录、注册界面


目录结构分析


1684138053292.jpg

conf:配置一些三方参数:如接口请求地址、路径、数据库信息等

img:存放引用图片(通过接口从后台获取图片也是可行的)

qss:存放界面样式文件

src:为项目源码文件。每个界面为一个module。module中包含原始ui文件和逻辑代码文件

ui:本例采用designer设计ui,故将项目所有ui文件,存于ui文件中

app.py:文件为项目启动文件


代码结构分析


app.py

main类将所有界面做集合,目的是将所有的界面组件联动。如图所示。self包含所有界面代码,将self作为实参传给每个模块类,实现界面联动。

class main():
    def __init__(self):
        super(main, self).__init__()
        '将所有的界面做集合'
        self.login_ui = Login(self)
        self.regis_ui = Regis(self)
        self.index_ui = Index(self)
        '初始化登录界面'
        self.login_ui.login_win.show()


login_module>login_ui

ui文件不多赘述,但注意:ui文件不宜手动修改,因为它是自动生成的,或许在开发阶段还需要ui源文件通过designer进行增删改的操作。此时再转换为py时,可以与逻辑文件兼容。

class Ui_Form(object):
    def setupUi(self, Form):
        if not Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(373, 249)
        self.lineEdit = QLineEdit(Form)
        self.lineEdit.setObjectName(u"lineEdit")
        self.lineEdit.setGeometry(QRect(100, 70, 171, 21))
        self.lineEdit_2 = QLineEdit(Form)
        self.lineEdit_2.setObjectName(u"lineEdit_2")
        self.lineEdit_2.setGeometry(QRect(100, 110, 171, 21))
        self.pushButton = QPushButton(Form)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setGeometry(QRect(110, 180, 161, 31))
        self.label = QLabel(Form)
        self.label.setObjectName(u"label")
        self.label.setGeometry(QRect(170, 20, 91, 31))
        self.label.setStyleSheet(u"font: 900 11pt \"Arial Black\";")
        self.checkBox = QCheckBox(Form)
        self.checkBox.setObjectName(u"checkBox")
        self.checkBox.setGeometry(QRect(110, 150, 80, 20))
        self.checkBox_2 = QCheckBox(Form)
        self.checkBox_2.setObjectName(u"checkBox_2")
        self.checkBox_2.setGeometry(QRect(200, 150, 80, 20))
        self.retranslateUi(Form)
        QMetaObject.connectSlotsByName(Form)
    # setupUi
    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"the app", None))
        self.pushButton.setText(QCoreApplication.translate("Form", "登录", None))
        self.label.setText(QCoreApplication.translate("Form", "登录", None))
        self.checkBox.setText(QCoreApplication.translate("Form", "自动登录", None))
        self.checkBox_2.setText(QCoreApplication.translate("Form", "记住密码", None))
    # retranslateUi


login_module>login

继承ui类,此文件中编写逻辑代码。每个逻辑文件的主类中的init都将整个项目模块的代码作为实参传入,故项目每个模块都可以实现对全部模块的联动。

class MyQLabel(QLabel):
    # 自定义信号, 注意信号必须为类属性
    button_clicked_signal = Signal()
    def __init__(self, parent=None):
        super(MyQLabel, self).__init__(parent)
    def mouseReleaseEvent(self, QMouseEvent):
        self.button_clicked_signal.emit()
    # 可在外部与槽函数连接
    def connect_customized_slot(self, func):
        self.button_clicked_signal.connect(func)
class Login(Ui_Form):
    def __init__(self,main):
        super(Login, self).__init__()
        self.main=main
        self.login_win=QWidget()
        self.setupUi(self.login_win)
        '背景提示文字'
        self.lineEdit.setPlaceholderText("name")
        self.lineEdit_2.setPlaceholderText("password")
        '设置密码格式'
        self.lineEdit_2.setEchoMode(QLineEdit.Password)
        self.label2=MyQLabel(self.login_win)
        self.label2.setText('点击注册')
        self.label2.setGeometry(QRect(10, 220, 91, 31))
        'label点击事件'
        self.label2.connect_customized_slot(self.login_regis_show)
        '禁止窗口拉伸、禁用最大化按钮'
        self.login_win.setFixedSize(self.login_win.width(), self.login_win.height())
        '登录,进入主界面'
        self.pushButton.clicked.connect(self.login_index_show)
    def login_regis_show(self):
        self.login_win.close()
        self.main.regis_ui.regis_win.show()
    def login_index_show(self):
        self.login_win.close()
        self.main.index_ui.index_win.show()



完整源码地址


链接:https://pan.baidu.com/s/1vdoJvlYN1rBvP50kPUIc9w

提取码:6xp8

相关文章
|
11天前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
6月前
|
区块链
【qt】最快的开发界面效率——混合编程3
【qt】最快的开发界面效率——混合编程
95 1
|
6月前
【qt】最快的开发界面效率——混合编程2
【qt】最快的开发界面效率——混合编程
78 1
|
6月前
【qt】最快的开发界面效率——混合编程1
【qt】最快的开发界面效率——混合编程
77 0
|
6月前
|
IDE 开发工具 C语言
QT案例IDE编写 -- 代码编写
QT案例IDE编写 -- 代码编写
72 0
Qt三方库开发技术:QXlsx介绍、编译和使用
Qt三方库开发技术:QXlsx介绍、编译和使用
Qt三方库开发技术:QXlsx介绍、编译和使用
|
Python 容器
Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)
一个典型的GUI应用程序可能有多个窗口,选项卡控件和堆栈窗口控件允许一次使用其中的一个窗口。然而,很多时候这种方法不是很有用,因为其他窗口的视图是隐藏的一种同时显示多个窗口的方法是,创建多个独立的窗口,这些独立的窗口被称为SDI(Single Document Interface,单文档界面),每个窗口都可以有自己的菜单系统、工具栏等。这需要占用较多的内存资源。
|
缓存 安全 Go
Go 开发常用操作技巧--模块管理
Go 依赖管理经历了 3 个阶段,GOPATH、Go Vendor、Go Module。
127 0
Go 开发常用操作技巧--模块管理
Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法
Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法
Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法
|
Ubuntu Unix C语言
Qt三方库开发技术(一):QuaZIP介绍、编译和使用
Qt三方库开发技术(一):QuaZIP介绍、编译和使用
Qt三方库开发技术(一):QuaZIP介绍、编译和使用