Python GUI教程(七):转换qt设计师的ui代码为Python代码

本篇我们将会介绍到:

  • 查看qt设计师生成的UI代码;
  • 通过pyuic5工具转换qt设计师UI为Python代码;

查看qt设计师生成的UI文件

我们在qt设计师中设计好的GUI窗口都会被保存为.ui格式的文件。

实质上,.ui文件依然是文本格式文件,我们使用notepad++打开刚刚保存的.ui文件:

可以发现,.ui文件其实是一个xml文件,其通过不同的标签来表示不同的窗口部件或是行为和信号槽的声明和描述。

通过pyuic5转换UI文件为Python文件

设计好的UI文件如何需要转换为Python文件,该怎么办?毕竟我们需要使用Python来扩展GUI的功能。

我们可以使用PyQt自带的pyuic5工具,对Qt设计师保存的.ui文件进行转换。

pyuic5是一个命令行工具,直接在cmd命令行界面运行即可。下面我们使用pyuic5将刚刚保存的UI文件转换问Python代码:

运行之后,便会自动生成一个ui2py.py的python文件,我们打开看看:

from PyQt5 import QtCore, QtGui, QtWidgets  class Ui_MainWindow(object):     def setupUi(self, MainWindow):         MainWindow.setObjectName("MainWindow")         MainWindow.resize(585, 477)         self.centralwidget = QtWidgets.QWidget(MainWindow)         self.centralwidget.setObjectName("centralwidget")         self.pushButton = QtWidgets.QPushButton(self.centralwidget)         self.pushButton.setGeometry(QtCore.QRect(170, 140, 75, 23))         self.pushButton.setObjectName("pushButton")         MainWindow.setCentralWidget(self.centralwidget)         self.menubar = QtWidgets.QMenuBar(MainWindow)         self.menubar.setGeometry(QtCore.QRect(0, 0, 585, 23))         self.menubar.setObjectName("menubar")         self.menu = QtWidgets.QMenu(self.menubar)         self.menu.setObjectName("menu")         MainWindow.setMenuBar(self.menubar)         self.statusbar = QtWidgets.QStatusBar(MainWindow)         self.statusbar.setObjectName("statusbar")         MainWindow.setStatusBar(self.statusbar)         self.actionMen1 = QtWidgets.QAction(MainWindow)         self.actionMen1.setObjectName("actionMen1")         self.actionMen2 = QtWidgets.QAction(MainWindow)         self.actionMen2.setObjectName("actionMen2")         self.menu.addAction(self.actionMen1)         self.menu.addSeparator()         self.menu.addAction(self.actionMen2)         self.menubar.addAction(self.menu.menuAction())          self.retranslateUi(MainWindow)         QtCore.QMetaObject.connectSlotsByName(MainWindow)      def retranslateUi(self, MainWindow):         _translate = QtCore.QCoreApplication.translate         MainWindow.setWindowTitle(_translate("MainWindow", "州的先生zmister.com PythonGUI教程"))         self.pushButton.setText(_translate("MainWindow", "PushButton"))         self.menu.setTitle(_translate("MainWindow", "文件"))         self.actionMen1.setText(_translate("MainWindow", "men1"))         self.actionMen2.setText(_translate("MainWindow", "men2"))   if __name__ == "__main__":     import sys     app = QtWidgets.QApplication(sys.argv)     MainWindow = QtWidgets.QMainWindow()     ui = Ui_MainWindow()     ui.setupUi(MainWindow)     MainWindow.show()     sys.exit(app.exec_()) 

生成的是标准的Python代码,运行一下,看看是否和qt设计师中的一致:

嗯,并无区别。

修改信号槽

除了直接使用UI文件转换而来的PythonGUI代码,我们有时候也需要对部分事件进行修改。
我们可以在qt设计师中添加简单的信号槽,复制的信号槽还是得自己在python代码中定义。

首先,我们在窗口中添加一个label标签,设置一个信号槽为:点击按钮的时候,label标签就清空。

然后使用pyuic5将其转换为Python代码,运行正常,按钮的信号槽也正常:

下面,我们并不想在点击button按钮的时候label标签消失,而是换一个文字。我们该怎么做呢?

直接在Python代码中进行修改,添加一个方法,并连接到信号槽上:

现在点击按钮之后,label标签会变为“zmister”而不是像之前那样清空。