Python 中 PyQt5 + pycharm 调用 Qt Designer,将.ui文件转换成 .py 文件
?
From:https://blog.csdn.net/qq_40666028/article/details/81069878
基于Qt Designer 和 pyuic 開發 UI 界面的方法:https://blog.csdn.net/philipyou/article/details/80309339
QtDesigner 安裝:http://code.py40.com/2540.html
用 QtDesigner 設計第一個界面:http://code.py40.com/2561.html
?
使用 python 進行開發過程中,不可避免會用到圖形用戶界面(Graphical User Interface,GUI),目前常用的 GUI 控件集有PyQt、Tkinter、wxPython、PyGTK 等。?
本文選用的控件集為 PyQt5,開發環境如下:
| windows10 | 64bit |
| PyCharm | 2019.1.3 |
| python | 3.7.4 |
| PyQt5 | 5.10 |
?
?
1. PyCharm 中添加 Qt Designer 工具
?
可以根據自己的? python 安裝 情況 填寫。截圖:
?
?
2. PyCharm 中添加 Pyuic 工具
?
可以根據自己的? python 安裝 情況 填寫。截圖:
系統自定義 宏參數( 點擊 宏參數 時 可以實時顯示對應當前工程 的 值?):
?
注意:如果不填寫 Arguments 這個選項時,在 Pycharm 中, 點擊 .ui 文件 -> 然后右鍵 ->?ExternalTools -> PyUIC 沒法生成? .py 文件。只有通過命令行 生成 .py 文件:pyuic5.exe test.ui -o test.py。只要操作系統上正確配置python環境之后,pyuic5 也是一個可以識別的命令行指令。
cmd 中打開 xxx.ui 所在路徑例
然后輸入:pyuic5 -o xxx.py xxx.ui 回車。
其中:
? ? ? ? -o 后的參數為 輸出文件 的 名稱?
? ? ? ? -o 后第二個參數即為生成的 ui文件 的 名稱
?
?
3. 設計 UI 文件 并轉換成 .py 文件
?
將 Qt Desiginer 設計的界面保存為?.ui?文件,在 PyCharm 中選中此文件,用添加的外部工具?Pyuic?轉換成同名的?.py文件。?
生成的?.py文件中只有一個從?object類繼承的?Ui_MainWindow的類,無法運行,需要新建一個python文件調用。
如果上面 pyuic 添加了 Arguments 參數,生成 .py 文件很簡單:右鍵.ui文件 -> External Tools -> pyUIC,即可自動生成??
?
?
4. 運行 .py 文件
?
PyQt5基本功能:http://code.py40.com/1961.html
?
這個時候直接運行 .py 文件,發現圖形界面不會顯示。
有兩種方法可以顯示界面。
?
方法 1 :直接運行這個 .py文件 就能看到界面的方式
?
在文件末尾加上這一段代碼:
if __name__ == "__main__":import sysapp = QtWidgets.QApplication(sys.argv) # 創建一個QApplication,也就是你要開發的軟件appMainWindow = QtWidgets.QMainWindow() # 創建一個QMainWindow,用來裝載你需要的各種組件、控件# MainWindow = QtWidgets.QWidget() # 創建一個QMainWindow,用來裝載你需要的各種組件、控件ui = Ui_Form() # ui是你創建的ui類的實例化對象ui.setupUi(MainWindow) # 執行類中的setupUi方法,方法的參數是第二步中創建的QMainWindowMainWindow.show() # 執行QMainWindow的show()方法,顯示這個QMainWindowsys.exit(app.exec_()) # 使用exit()或者點擊關閉按鈕退出QApplication然后?右鍵 -> run 就可以看到界面了
widget = QtWidgets.QWidget()?
因為Qt Designer默認繼承的object類,不提供show()顯示方法,所以我們生成一個 QWidget 對象來重載我們設計的Ui_MainWindow類,達到顯示效果。
app.exec_()? ? ? ? ? ? ? ? ? 運行app?
sys.exit(app.exec_()) ? 消息循環結束之后返回0,接著調用 sys.exit(0) 退出程序
?
完整示例代碼( temp.py ):
# -*- coding: utf-8 -*- # @Author : # @File : temp.py # @Software: PyCharm # @description : XXXfrom PyQt5 import QtCore, QtGui, QtWidgets import sysclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(400, 300)self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setGeometry(QtCore.QRect(70, 220, 75, 23))self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setGeometry(QtCore.QRect(220, 220, 75, 23))self.pushButton_2.setObjectName("pushButton_2")self.checkBox = QtWidgets.QCheckBox(Form)self.checkBox.setGeometry(QtCore.QRect(70, 180, 141, 16))self.checkBox.setObjectName("checkBox")self.lineEdit = QtWidgets.QLineEdit(Form)self.lineEdit.setGeometry(QtCore.QRect(130, 56, 181, 20))self.lineEdit.setObjectName("lineEdit")self.lineEdit_2 = QtWidgets.QLineEdit(Form)self.lineEdit_2.setGeometry(QtCore.QRect(130, 110, 181, 20))self.lineEdit_2.setObjectName("lineEdit_2")self.label = QtWidgets.QLabel(Form)self.label.setGeometry(QtCore.QRect(70, 60, 54, 12))self.label.setObjectName("label")self.label_2 = QtWidgets.QLabel(Form)self.label_2.setGeometry(QtCore.QRect(70, 110, 54, 12))self.label_2.setObjectName("label_2")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.pushButton.setText(_translate("Form", "取消"))self.pushButton_2.setText(_translate("Form", "確定"))self.checkBox.setText(_translate("Form", "記住用戶名和密碼"))self.label.setText(_translate("Form", "用戶名:"))self.label_2.setText(_translate("Form", "密碼:"))if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv) # 創建一個QApplication,也就是你要開發的軟件appMainWindow = QtWidgets.QMainWindow() # 創建一個QMainWindow,用來裝載你需要的各種組件、控件ui = Ui_Form() # ui是你創建的ui類的實例化對象ui.setupUi(MainWindow) # 執行類中的setupUi方法,方法的參數是第二步中創建的QMainWindowMainWindow.show() # 執行QMainWindow的show()方法,顯示這個QMainWindowsys.exit(app.exec_()) # 使用exit()或者點擊關閉按鈕退出QApplication程序云截圖:
?
?
方法 2:在 別的文件 中 調用 這個模塊
?
這個和 方法 1 中的 右鍵?run 就能顯示界面的方式?并不沖突,只是要在別的文件中調用這個模塊。
調用文件的寫法( main.py ):
# -*- coding: utf-8 -*- # @Author : # @File : main.py # @Software: PyCharm # @description : XXXimport sys from temp import Ui_Form from PyQt5 import QtWidgets# 這個類繼承界面UI類 class MyWindow1(QtWidgets.QWidget, Ui_Form):def __init__(self):super(MyWindow1, self).__init__()self.setupUi(self)# 這個類繼承界面UI類 class MyWindow2(QtWidgets.QMainWindow, Ui_Form):def __init__(self):super(MyWindow2, self).__init__()self.setupUi(self)# 調用show if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)form_1 = MyWindow1()form_1.setWindowTitle('form_1')form_1.show()form_2 = MyWindow2()form_2.setWindowTitle('form_2')form_2.show()sys.exit(app.exec_())被調用文件( temp.py )和上面 temp.py 文件一樣
# -*- coding: utf-8 -*- # @Author : # @File : temp.py # @Software: PyCharm # @description : XXXfrom PyQt5 import QtCore, QtGui, QtWidgets import sysclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(400, 300)self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setGeometry(QtCore.QRect(70, 220, 75, 23))self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setGeometry(QtCore.QRect(220, 220, 75, 23))self.pushButton_2.setObjectName("pushButton_2")self.checkBox = QtWidgets.QCheckBox(Form)self.checkBox.setGeometry(QtCore.QRect(70, 180, 141, 16))self.checkBox.setObjectName("checkBox")self.lineEdit = QtWidgets.QLineEdit(Form)self.lineEdit.setGeometry(QtCore.QRect(130, 56, 181, 20))self.lineEdit.setObjectName("lineEdit")self.lineEdit_2 = QtWidgets.QLineEdit(Form)self.lineEdit_2.setGeometry(QtCore.QRect(130, 110, 181, 20))self.lineEdit_2.setObjectName("lineEdit_2")self.label = QtWidgets.QLabel(Form)self.label.setGeometry(QtCore.QRect(70, 60, 54, 12))self.label.setObjectName("label")self.label_2 = QtWidgets.QLabel(Form)self.label_2.setGeometry(QtCore.QRect(70, 110, 54, 12))self.label_2.setObjectName("label_2")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.pushButton.setText(_translate("Form", "取消"))self.pushButton_2.setText(_translate("Form", "確定"))self.checkBox.setText(_translate("Form", "記住用戶名和密碼"))self.label.setText(_translate("Form", "用戶名:"))self.label_2.setText(_translate("Form", "密碼:"))if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv) # 創建一個QApplication,也就是你要開發的軟件appMainWindow = QtWidgets.QMainWindow() # 創建一個QMainWindow,用來裝載你需要的各種組件、控件ui = Ui_Form() # ui是你創建的ui類的實例化對象ui.setupUi(MainWindow) # 執行類中的setupUi方法,方法的參數是第二步中創建的QMainWindowMainWindow.show() # 執行QMainWindow的show()方法,顯示這個QMainWindowsys.exit(app.exec_()) # 使用exit()或者點擊關閉按鈕退出QApplication程序運行截圖:
?
?
?
?
總結
以上是生活随笔為你收集整理的Python 中 PyQt5 + pycharm 调用 Qt Designer,将.ui文件转换成 .py 文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菜鸟教程 之 HTML DOM 和 浏览
- 下一篇: 小甲鱼 OllyDbg 教程系列 (十七