PyQt5學習筆記-從主窗體打開一個子窗體
軟件環境:
Eric6+Python3.5+PyQt5
試驗目標:
1.點擊菜單項Open,打開一個子窗體
2.點擊按鈕Open,打開一個子窗體
主窗體設計:
1、增加一個菜單項Open
2、增加一個按鈕Open
子窗體設計:
1、只放一個按鈕Exit
設計步驟
1、創建主窗體
啟動Eric6,點擊頂部菜單Project,點擊New,給出Project Name,同時設置項目路徑,然后點下面的OK按鈕
2、點擊如下圖的1圖標,然后點New form
3、Select a form type,選擇Main Window
4.文件名,設置為mainWindow,保存后,則是MainWindow.ui
5、增加菜單,在窗體區域,點鼠標右鍵,點“創建菜單欄”,這里只增加一個主菜單項File,兩個子菜單項Open和Exit
6、在窗體上放置一個按鈕Open,從左側欄找到push button,拖拽到窗體上,修改按鈕屬性,objectName:btn_Open,Text:Open
7、然后點左上角的保存按鈕,關閉Qt Designer
8、增加第子窗體,參照前面第2步,點New form,然后Select a form type,選擇Widget,文件名:ChildForm.ui
9、在這個子窗體上增加一個按鈕Exit ,從左側欄拖一個push button,調整按鈕大小,修改屬性,objectName:btn_Exit,Text:Exit
點左上角的保存按鈕,保存這個窗體文件,然后關閉Qt Designer
10、編譯窗體,從XXX.ui文件生成ui_XXX.py文件
依次選中這兩個文件,點鼠標右鍵,點Compile form
點窗體左側的頁簽圖標,可以看到增加了兩個文件:Ui_MainWindow.py、Ui_ChildForm.py
11、Ui_MainWindow.py和Ui_ChildForm.py是界面文件,下面增加業務邏輯文件
點頁簽圖標,選中MainWindow.ui文件,點鼠標右鍵,點選Generate Dialog Code菜單項
12、點New 按鈕,className 為MainWindow,然后點OK按鈕
13、綁定槽函數,
1)、綁定菜單項槽函數,選擇on_ActionXXX_triggered()
依次點開actionExit(QAction)、actionOpen(QAction),勾選onAction_Exit_triggered()、onAction_Open_triggered()
2)、綁定按鈕槽函數,點開btn_Open(QPushButton),勾選on_btn_Open_clicked()
3)、給子窗體綁定槽函數,選中Ui_ChildForm.ui,點鼠標右鍵,選中Generate Dialog Code菜單項,className命名為ChildForm
勾選on_btn_Exit_clicked()
14、重新編譯兩個窗體文件
選中一個ui文件,然后點鼠標右鍵,點選Compile all forms,生成代碼文件
點頁簽,則可以看到,系統新增了兩個文件MainWindow.py和ChildForm.py
15、開始完善代碼
雙擊MainWindow.py,打開這個文件,編輯代碼,進行相應完善,項目啟動,從MainWindow.py進行啟動,需要實例化窗體界面類,包括主窗體和子窗體
修改內容:
1)、把.Ui_MainWindow前面的點號去掉,不然運行會報錯
2)、導入子窗體
增加語句:from Ui_ChildForm import Ui_ChildForm
16、附相關文件的代碼:
1)、MainWindow.py
# -*- coding: utf-8 -*- """ Module implementing MainWindow. """ from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QMainWindow, QWidget from PyQt5 import QtWidgets from Ui_MainWindow import Ui_MainWindow from Ui_ChildForm import Ui_ChildForm class MainWindow(QMainWindow, Ui_MainWindow): """ Class documentation goes here. """ def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(MainWindow, self).__init__(parent) self.setupUi(self) @pyqtSlot() def on_btn_Open_clicked(self): """ Slot documentation goes here. """ # TODO: not implemented yet #raise NotImplementedError ch.show() @pyqtSlot() def on_actionOpen_triggered(self): """ Slot documentation goes here. """ # TODO: not implemented yet #raise NotImplementedError ch.show() @pyqtSlot() def on_actionExit_triggered(self): """ Slot documentation goes here. """ # TODO: not implemented yet #raise NotImplementedError sys.exit(0) class ChildForm(QWidget, Ui_ChildForm): def __init__(self): #super(QWidget, self).__init__(parent) super(QWidget, self).__init__() self.setupUi(self) self.btn_Exit.clicked.connect(self.close) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) #實例化主窗體 mainForm = MainWindow() #顯示主窗體 mainForm.show() #實例化子窗體 ch=ChildForm() sys.exit(app.exec_())
2)、Ui_MainWindow.py
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'C:\Work\Python\PyQt5\Test\MainWindow.ui' # # Created by: PyQt5 UI code generator 5.6 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralWidget = QtWidgets.QWidget(MainWindow) self.centralWidget.setObjectName("centralWidget") self.btn_Open = QtWidgets.QPushButton(self.centralWidget) self.btn_Open.setGeometry(QtCore.QRect(210, 120, 81, 31)) self.btn_Open.setObjectName("btn_Open") MainWindow.setCentralWidget(self.centralWidget) self.menuBar = QtWidgets.QMenuBar(MainWindow) self.menuBar.setGeometry(QtCore.QRect(0, 0, 800, 23)) self.menuBar.setObjectName("menuBar") self.menuFile = QtWidgets.QMenu(self.menuBar) self.menuFile.setObjectName("menuFile") MainWindow.setMenuBar(self.menuBar) self.actionOpen = QtWidgets.QAction(MainWindow) self.actionOpen.setObjectName("actionOpen") self.actionExit = QtWidgets.QAction(MainWindow) self.actionExit.setObjectName("actionExit") self.menuFile.addAction(self.actionOpen) self.menuFile.addAction(self.actionExit) self.menuBar.addAction(self.menuFile.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.btn_Open.setText(_translate("MainWindow", "Open")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.actionOpen.setText(_translate("MainWindow", "Open")) self.actionExit.setText(_translate("MainWindow", "Exit")) 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_())
3)、ChildForm.py
# -*- coding: utf-8 -*- """ Module implementing ChildForm. """ from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QWidget from Ui_ChildForm import Ui_Form class ChildForm(QWidget, Ui_Form): """ Class documentation goes here. """ def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(ChildForm, self).__init__(parent) self.setupUi(self) @pyqtSlot() def on_btn_Exit_clicked(self): """ Slot documentation goes here. """ # TODO: not implemented yet raise NotImplementedError
4)、Ui_ChildForm.py
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'C:\Work\Python\PyQt5\Test\ChildForm.ui' # # Created by: PyQt5 UI code generator 5.6 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_ChildForm(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(400, 300) self.btn_Exit = QtWidgets.QPushButton(Form) self.btn_Exit.setGeometry(QtCore.QRect(140, 110, 91, 41)) self.btn_Exit.setObjectName("btn_Exit") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.btn_Exit.setText(_translate("Form", "Exit")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_ChildForm() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
本示例測試可以運行:
運行,點擊頂部的運行圖標
設置運行使用的Python解釋器及命令行,Python 本項目MainWindow.py的路徑,點OK按鈕
運行結果:
點菜單項里的Open或點Open按鈕,則彈出子窗體
點子窗體里的Exit按鈕,則關閉子窗體
代碼下載,百度網盤分享:
https://pan.baidu.com/s/1LzUVY2uPggEktCtACwC-JQ
提取碼:i0qq