1. 設計UI界面
Qt Designer的保存路徑在
C:\Users\u0013662\AppData\Local\Programs\Python\Python36\Lib\site-packages\pyqt5-tools
打開QtDesigner,新建一個“Dialog Without Buttons”
從左側的WidgetBox拖入一個Label,一個Text和一個Button
文件保存爲test.ui
2. 使用pyuic5將.ui文件轉換爲.py文件。
在CMD窗口下執行命令:pyuic5 test.ui –o test.py
如果執行成功,在同目錄下生成test.py文件
內容如下:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(130,70, 81, 18))
self.label.setObjectName("label")
self.pushButton =QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(140, 210, 112, 34))
self.pushButton.setObjectName("pushButton")
self.lineEdit =QtWidgets.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(100, 130, 171, 41))
self.lineEdit.setObjectName("lineEdit")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate =QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog","Dialog"))
self.label.setText(_translate("Dialog","TextLabel"))
self.pushButton.setText(_translate("Dialog","PushButton"))
這個程序定義的是各個界面元素和它們的位置、名稱、標籤等信息,當然,Qt Designer也可以通過信號和槽的機制爲控件添加響應事件,在此文暫不介紹。
3. 編寫執行程序load.py
import sys
from test import *
fromPyQt5.QtWidgets import *
classMyWidgets(Ui_Dialog):
def setupUi(self,Dialog):
super().setupUi(Dialog)
self.pushButton.clicked.connect(self.A)
def A(self,Dialog):
try:
EditText=self.lineEdit.text()
_translate =QtCore.QCoreApplication.translate
self.label.setText(_translate("Dialog", EditText))
except:
print(sys.exc_info())
if__name__ == '__main__':
app=QtWidgets.QApplication(sys.argv)
Form=QtWidgets.QWidget()
ui=MyWidgets()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
這個程序新定義了一個類MyWidgets,MyWidgets繼承自test.py中的類Ui_Dialog,首先它重寫了setupUi方法,重寫這個方法是爲了爲Button綁定觸發事件,當然,它要先執行super().setupUi(Dialog)把父類的整個方法繼承過來,再加入self.pushButton.clicked.connect(self.A)用於綁定事件。A方法是MyWidgets的成員函數,具體實現按鈕動作。
if__name__ == '__main__':
app=QtWidgets.QApplication(sys.argv)
Form=QtWidgets.QWidget()
ui=MyWidgets()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
這段是程序執行的入口,由於MyWidgets的setupUi方法要求一個Dialog參數,因此Form=QtWidgets.QWidget()聲明一個Form, 再生成一個MyWidgets實例,執行SetupUi構造整個頁面,執行Form.show()顯示界面。
有一個問題,整個程序操作的是Object的子類Ui_Dialog,可爲什麼調用Form,show()來顯示界面呢?注意類似self.pushButton= QtWidgets.QPushButton(Dialog)聲明控件時總有一個參數Dialog,可以這樣理解,pushButton是UI_Dialog的屬性,它指的是Dialog上的一個界面元素。這本身就是一個顯示和操作分離的邏輯。
4. 這可以作爲一個程序開發框架。
(1) 用QT Desinger設計界面生成ui
(2) 用pyuic5把ui轉成界面py
(3) 編寫界面py的子類,在子類裏定義並綁定控件的動作
(4) 編寫程序執行入口,執行程序。