本文涉及:PyQt5,Qt Designer,PyCharm
目錄
先看下完成效果: ???????
步驟1:用Qt Designer創(chuàng)建2個窗體
步驟2:將子窗體和主窗體上的按鈕控件進(jìn)行關(guān)聯(lián)
完整代碼
視頻里我只設(shè)計了1個主窗口和1個子窗口,不管你需要多少個子窗口,其創(chuàng)建方法都是一樣的。下面我來介紹一下具體的實現(xiàn)方式。
打開Qt Designer,直接一次性新建2個Main Window窗體,然后在主窗體的中間我放了1個按鈕控件,如下圖所示:
然后分別保存2個窗體的.ui文件到同1個文件夾中。注意:在保存時,需要分別將鼠標(biāo)焦點定位到要保存的窗體上,單獨為每個窗體進(jìn)行保存;而在將.ui文件轉(zhuǎn)化為.py文件時,也需要分別選中每個.ui文件,單獨進(jìn)行轉(zhuǎn)換,完成后如下圖所示:
首先看一下untitled2.py文件,在自動轉(zhuǎn)換后的代碼中,默認(rèn)繼承object類,代碼如下:
class Ui_MainWindow(object):
為了執(zhí)行窗口操作,需要將繼承的object類修改為QMainWindow類,由于QMainWindow類位于PyQt5.QtWidgets模塊中,因此需要進(jìn)行導(dǎo)入,修改后的代碼如下:
- from PyQt5.QtWidgets import QMainWindow
- class Ui_MainWindow(QMainWindow):
修改完子窗體的.py文件中的繼承類之后,打開untitled.py主窗體文件,在該文件中,首先定義一個槽函數(shù),用來使用QMainWindow對象的show()方法打開子窗體,代碼如下:
- def open(self): # 創(chuàng)建1個自定義函數(shù)open打開子窗體
- import untitled2 # 導(dǎo)入子窗體
- self.second = untitled2.Ui_MainWindow() # 引用子窗體,并命名為second
- self.second.resize(736, 467) # 初始化子窗體大小
- self.second.setWindowTitle("這是子窗體") # 初始化子窗體的標(biāo)題
- self.second.show() # 顯示子窗體
然后將PushButton按鈕的clicked()信號與自定義的槽函數(shù)open()關(guān)聯(lián),代碼如下:
self.pushButton.clicked.connect(self.open)
運行untitled.py主窗體,點擊按鈕即可打開子窗體。
有不清楚的,可以對照下面源碼看一下。
主窗體源碼(untitled.py):
- from PyQt5 import QtCore, QtGui, QtWidgets
- class Ui_MainWindow(object):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(750, 500)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- self.pushButton = QtWidgets.QPushButton(self.centralwidget)
- self.pushButton.setGeometry(QtCore.QRect(190, 140, 291, 81))
- self.pushButton.setObjectName("pushButton")
- # 將按鈕和顯示第2個窗口的自定義函數(shù)關(guān)聯(lián)
- self.pushButton.clicked.connect(self.open)
- MainWindow.setCentralWidget(self.centralwidget)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- self.pushButton.setText(_translate("MainWindow", "打開新窗口"))
- def open(self): # 創(chuàng)建1個自定義函數(shù)open打開子窗體
- import untitled2 # 導(dǎo)入子窗體
- self.second = untitled2.Ui_MainWindow() # 引用子窗體,并命名為second
- self.second.resize(736, 467) # 初始化子窗體大小
- self.second.setWindowTitle("這是子窗體") # 初始化子窗體的標(biāo)題
- self.second.show() # 顯示子窗體
- import sys
- if __name__ == '__main__':
- app = QtWidgets.QApplication(sys.argv)
- MainWindow = QtWidgets.QMainWindow()
- ui = Ui_MainWindow()
- ui.setupUi(MainWindow)
- MainWindow.show()
- sys.exit(app.exec_())
子窗體源碼(untitled2.py):
- from PyQt5 import QtCore, QtGui, QtWidgets
- from PyQt5.QtWidgets import QMainWindow
- class Ui_MainWindow(QMainWindow):
- def setupUi(self, MainWindow):
- MainWindow.setObjectName("MainWindow")
- MainWindow.resize(736, 467)
- self.centralwidget = QtWidgets.QWidget(MainWindow)
- self.centralwidget.setObjectName("centralwidget")
- MainWindow.setCentralWidget(self.centralwidget)
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
- self.statusbar.setObjectName("statusbar")
- MainWindow.setStatusBar(self.statusbar)
- self.retranslateUi(MainWindow)
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
- def retranslateUi(self, MainWindow):
- _translate = QtCore.QCoreApplication.translate
- MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
- def __init__(self):
- super(Ui_MainWindow, self).__init__()
- self.setupUi(self)
天冷手寒,碼文不易,還望各位看官老爺點一下關(guān)注,妾身感激涕零 ~~~
聯(lián)系客服