pyqt 多窗口跳轉

今天在作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)         
View Code

具體實現: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_())
main_q

 

生成的子窗口文件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_())
calendars

經過生成以上兩個文件以後,編寫一個文件,將兩個窗體關聯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_())
pyqt_main

完成,接下來能夠讓窗口返回數據,或者更多的操做。orm

參考:http://www.javashuo.com/article/p-nbwthpre-eu.htmlblog

相關文章
相關標籤/搜索