由于设计出来的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_())