PyQt5學習筆記-從主窗體打開一個子窗體


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM