使用Designer设计UI并通过继承实现业务逻辑

41 阅读1分钟

由于设计出来的UI经常面临修改,每次都要重新转换为py文件,如果将业务逻辑直接写在转换后的py文件中,就会被覆盖。

下面是一个实现继承的完整案例,也是作为写这个专栏的第一个处女作了。

1、目前已经有一个使用Designer设计好的ui文件,需要先将其转换为py文件

pyuic5 task2.ui -o task2.py

2、继承并实现业务逻辑

为了实现ui中不同选项卡页面的功能,防止单个业务py文件行数过大,可以按照选项卡页面个数,编写多个py文件,继承自同一个ui代码,分别实现其中一部分的控件业务:

比如这个ui文件里,使用了QtWidgets.QTableWidget控件实现了两个页面:任务页面和review页面。

先说一下代码的目录结构:

ui
----task2.py   //这个是UI文件转换后的py文件
manage.py
topup.py
run.py

下面是任务页面继承的实现,manage.py文件:

from ui.task2 import Ui_MainWindow

class TaskMainWindow(Ui_MainWindow):
    def initbind_signal_data(self):
        self.move(300,300)

        # 自定义列宽
        self.tableWidget.setColumnWidth(11, 450)

        # 设置某一列不可编辑        
        self.tableWidget.setItemDelegateForColumn(11, EmptyDelegate(self)) 

        # 给新增一行按钮点击事件绑定处理函数        
        self.pushButton.clicked.connect(self.table_add_newline)    

    def table_add_newline(self):
        pass

下面是review页面继承的实现,topup.py文件:

from ui.task2 import Ui_MainWindow

class ReviewWidget(Ui_MainWindow):
    def initbind_signal_data(self):
        # 给修改按钮点击事件绑定处理函数
        self.commandLinkButton_2.clicked.connect(self.alter_review_name)

        # 给保存按钮点击事件绑定处理函数
        self.commandLinkButton_4.clicked.connect(self.save_review)
    
    def alter_review_name(self):
        pass
    
    def save_review(self):
        pass

最后编写运行的入口,run.py文件:

from PyQt5.QtWidgets import QMainWindow,QApplication
from manage import TaskMainWindow
from topup import ReviewWidget
import sys

class AppMainWindow(QMainWindow,TaskMainWindow,ReviewWidget):
    def __init__(self, parent=None):
        super(AppMainWindow,self).__init__(parent)
        TaskMainWindow.setupUi(self,self)
        TaskMainWindow.initbind_signal_data(self)
        ReviewWidget.initbind_signal_data(self)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    win = AppMainWindow()
    win.show()

    sys.exit(app.exec_())