今天在作pyqt5的多頁面跳轉時遇到問題,一點擊button按鈕,程序會崩潰。在網上查了下,應該是當窗口A調用窗口B的時候,兩個窗口不能是同一類型。我寫的時候把A、B同時寫成了QWidget。把窗口B改爲Dialog類型後,就能夠成功調用了;若是想關聯更多窗口,方法類似便可。app
大概的模板以下:ide
class A(QWidget): def __init__(self): ...省略... self.btn = QPushButton('跳轉按鈕') def initUI(self): pass class B(QDialog): def __init__(self): pass def initUI(self): pass if __name__ == '__main__': app = QApplication(sys.argv) a = A() b = B() a.show() a.btn.clicked.connect(b.show)
具體實現:ui
使用qt designer 設計一個主窗口(帶有pushbutton按鈕),一個子窗口(我這裏是直接使用的Calendar部件)this
保存爲相應的.ui文件,以後使用pyuic5 -x -o XXX.py XXX.ui生成相應的XXX.py 文件spa
生成的主窗口文件:main_q.py(可直接運行):.net
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'C:\Users\Administrator\Desktop\main_q.ui' # # Created by: PyQt5 UI code generator 5.11.2 # # 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(1131, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) self.tabWidget.setGeometry(QtCore.QRect(-20, 10, 1121, 521)) self.tabWidget.setObjectName("tabWidget") self.tab = QtWidgets.QWidget() self.tab.setObjectName("tab") self.label_2 = QtWidgets.QLabel(self.tab) self.label_2.setGeometry(QtCore.QRect(60, 50, 101, 16)) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.tab) self.label_3.setGeometry(QtCore.QRect(60, 100, 91, 16)) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.tab) self.label_4.setGeometry(QtCore.QRect(60, 150, 101, 16)) self.label_4.setObjectName("label_4") self.lineEdit = QtWidgets.QLineEdit(self.tab) self.lineEdit.setGeometry(QtCore.QRect(202, 50, 171, 20)) self.lineEdit.setObjectName("lineEdit") self.lineEdit_2 = QtWidgets.QLineEdit(self.tab) self.lineEdit_2.setGeometry(QtCore.QRect(202, 100, 171, 21)) self.lineEdit_2.setObjectName("lineEdit_2") self.lineEdit_3 = QtWidgets.QLineEdit(self.tab) self.lineEdit_3.setGeometry(QtCore.QRect(202, 150, 171, 20)) self.lineEdit_3.setObjectName("lineEdit_3") self.pushButton = QtWidgets.QPushButton(self.tab) self.pushButton.setGeometry(QtCore.QRect(120, 240, 75, 41)) self.pushButton.setObjectName("pushButton") self.textEdit = QtWidgets.QTextEdit(self.tab) self.textEdit.setGeometry(QtCore.QRect(530, 10, 571, 381)) self.textEdit.setObjectName("textEdit") self.tabWidget.addTab(self.tab, "") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") self.groupBox = QtWidgets.QGroupBox(self.tab_2) self.groupBox.setGeometry(QtCore.QRect(10, 10, 161, 171)) self.groupBox.setObjectName("groupBox") self.layoutWidget = QtWidgets.QWidget(self.groupBox) self.layoutWidget.setGeometry(QtCore.QRect(10, 40, 91, 62)) self.layoutWidget.setObjectName("layoutWidget") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.radioButton = QtWidgets.QRadioButton(self.layoutWidget) self.radioButton.setObjectName("radioButton") self.verticalLayout_2.addWidget(self.radioButton) self.radioButton_2 = QtWidgets.QRadioButton(self.layoutWidget) self.radioButton_2.setObjectName("radioButton_2") self.verticalLayout_2.addWidget(self.radioButton_2) self.radioButton_3 = QtWidgets.QRadioButton(self.layoutWidget) self.radioButton_3.setObjectName("radioButton_3") self.verticalLayout_2.addWidget(self.radioButton_3) self.groupBox_2 = QtWidgets.QGroupBox(self.tab_2) self.groupBox_2.setGeometry(QtCore.QRect(199, 19, 351, 161)) self.groupBox_2.setObjectName("groupBox_2") self.layoutWidget1 = QtWidgets.QWidget(self.groupBox_2) self.layoutWidget1.setGeometry(QtCore.QRect(70, 20, 261, 102)) self.layoutWidget1.setObjectName("layoutWidget1") self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget1) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.dial = QtWidgets.QDial(self.layoutWidget1) self.dial.setObjectName("dial") self.horizontalLayout.addWidget(self.dial) self.lcdNumber = QtWidgets.QLCDNumber(self.layoutWidget1) self.lcdNumber.setObjectName("lcdNumber") self.horizontalLayout.addWidget(self.lcdNumber) self.fontComboBox = QtWidgets.QFontComboBox(self.tab_2) self.fontComboBox.setGeometry(QtCore.QRect(90, 220, 165, 22)) self.fontComboBox.setObjectName("fontComboBox") self.label = QtWidgets.QLabel(self.tab_2) self.label.setGeometry(QtCore.QRect(90, 300, 251, 91)) self.label.setLayoutDirection(QtCore.Qt.LeftToRight) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName("label") self.progressBar = QtWidgets.QProgressBar(self.tab_2) self.progressBar.setGeometry(QtCore.QRect(40, 440, 451, 23)) self.progressBar.setProperty("value", 24) self.progressBar.setObjectName("progressBar") self.tabWidget.addTab(self.tab_2, "") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1131, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label_2.setText(_translate("MainWindow", "請輸入開始時間:")) self.label_3.setText(_translate("MainWindow", "請輸入結束時間:")) self.label_4.setText(_translate("MainWindow", "請輸入k值:")) self.pushButton.setText(_translate("MainWindow", "開始查詢")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "選項卡1")) self.groupBox.setTitle(_translate("MainWindow", "功能選項")) self.radioButton.setText(_translate("MainWindow", "RadioButton")) self.radioButton_2.setText(_translate("MainWindow", "RadioButton")) self.radioButton_3.setText(_translate("MainWindow", "RadioButton")) self.groupBox_2.setTitle(_translate("MainWindow", "移動刻度盤")) self.label.setText(_translate("MainWindow", "TextLabel")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "選項卡2")) 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_())
生成的子窗口文件calendars.py(可直接運行:設計
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_calendar(object): def setupUi(self, calendar): calendar.setObjectName("calendar") calendar.resize(277, 247) self.calendarWidget = QtWidgets.QCalendarWidget(calendar) self.calendarWidget.setGeometry(QtCore.QRect(-3, -4, 281, 251)) self.calendarWidget.setObjectName("calendarWidget") self.retranslateUi(calendar) QtCore.QMetaObject.connectSlotsByName(calendar) def retranslateUi(self, calendar): _translate = QtCore.QCoreApplication.translate calendar.setWindowTitle(_translate("calendar", "Dialog")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) calendar = QtWidgets.QDialog() ui = Ui_calendar() ui.setupUi(calendar) calendar.show() sys.exit(app.exec_())
經過生成以上兩個文件以後,編寫一個文件,將兩個窗體關聯code
from GUI_pyqt.main_q import Ui_MainWindow from GUI_pyqt.calendars import Ui_calendar from PyQt5.QtWidgets import QApplication,QMainWindow,QDialog import sys class ParentWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.main_ui = Ui_MainWindow() self.main_ui.setupUi(self) class ChildWindow(QDialog): def __init__(self): super(ChildWindow,self).__init__() self.calendars = Ui_calendar() self.calendars.setupUi(self) if __name__ =="__main__": app = QApplication(sys.argv) window = ParentWindow() child = ChildWindow() #經過按鈕將兩個窗體關聯 btn = window.main_ui.pushButton btn.clicked.connect(child.show) #顯示 window.show() sys.exit(app.exec_())
完成,接下來能夠讓窗口返回數據,或者更多的操做。orm