如何在PyQt5中使用多个窗口?通过多个窗口和其他模块中的调用模块传递值

问题描述 投票:0回答:1

我已经用PyQt5创建了一个GUI。我总共有三个窗户。第一个窗口有一个按钮(**btn_OpenSecondWIndow**),可打开第二个窗口。第二个窗口有一个按钮(**btn_OpenCalendar**),可打开第三个(日历)窗口。用户从那里选择一个日期,然后在第三个窗口中选择一个按钮(**btn_selecteddate**),我想在第二个窗口的标签(label_Date)中显示该选择。

Snippet to get the flow

现在我在这里,第一个窗口工作正常,第二个窗口打开,但按钮不起作用。

当从第一个窗口打开窗口时,第二个窗口中的按钮不起作用,但是当类“ SecondWindow”被其自身而不是从第一个窗口调用时,它起作用。

这里是代码:

from PyQt5 import QtWidgets
from FirstWindow import Ui_FirstWindow
from SecondWindow import Ui_SecondWindow
from Calendar import Ui_CalendarWindow

class Calendar(QtWidgets.QMainWindow, Ui_CalendarWindow):                    
    def __init__(self):
        super().__init__()
        self.setupUi(self) 

class FirstWindow(QtWidgets.QMainWindow, Ui_FirstWindow):                    
    def __init__(self):
        super(FirstWindow,self).__init__()
        self.setupUi(self)   
        self.btn_OpenSecondWIndow.clicked.connect(self.open_SecondWindow) 

    def open_SecondWindow(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = SecondWindow()
        self.ui.setupUi(self.window)
        self.window.show()  
        self.setEnabled(False)
        self.window.setEnabled(True)

class SecondWindow(QtWidgets.QMainWindow, Ui_SecondWindow):                    
    def __init__(self):
        super(SecondWindow, self).__init__()
        self.setupUi(self)  
        self.btn_OpenCalendar.clicked.connect(self.Open_Calendar)

    def Open_Calendar(self):
        self.window = Calendar()      
        self.window.setupUi(self.window)
        self.window.show()
        self.window.btn_Selecteddate.clicked.connect(self.PickedDate)

    def PickedDate(self):    
        self.selecteddate = self.window.CalendarBox.selectedDate() 
        self.label_Date.setText(self.selecteddate.toString('MMM')+'-'+self.selecteddate.toString('yyyy'))  
        self.window.hide()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = FirstWindow()    
    window.show()
    sys.exit(app.exec_())

参考Ui类代码如下:

第一个窗口:

from PyQt5 import QtCore, QtWidgets


class Ui_FirstWindow(object):
    def setupUi(self, FirstWindow):
        FirstWindow.setObjectName("FirstWindow")
        FirstWindow.resize(380, 195)
        self.centralwidget = QtWidgets.QWidget(FirstWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_OpenSecondWIndow = QtWidgets.QPushButton(self.centralwidget)
        self.btn_OpenSecondWIndow.setGeometry(QtCore.QRect(80, 60, 221, 61))
        self.btn_OpenSecondWIndow.setObjectName("btn_OpenSecondWIndow")
        FirstWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(FirstWindow)
        self.statusbar.setObjectName("statusbar")
        FirstWindow.setStatusBar(self.statusbar)

        self.retranslateUi(FirstWindow)
        QtCore.QMetaObject.connectSlotsByName(FirstWindow)

    def retranslateUi(self, FirstWindow):
        _translate = QtCore.QCoreApplication.translate
        FirstWindow.setWindowTitle(_translate("FirstWindow", "MainWindow"))
        self.btn_OpenSecondWIndow.setText(_translate("FirstWindow", "Open Second Window"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    FirstWindow = QtWidgets.QMainWindow()
    ui = Ui_FirstWindow()
    ui.setupUi(FirstWindow)
    FirstWindow.show()
    sys.exit(app.exec_())

第二个窗口:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_SecondWindow(object):
    def setupUi(self, SecondWindow):
        SecondWindow.setObjectName("SecondWindow")
        SecondWindow.resize(654, 242)
        self.centralwidget = QtWidgets.QWidget(SecondWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_Date = QtWidgets.QLabel(self.centralwidget)
        self.label_Date.setGeometry(QtCore.QRect(330, 60, 281, 131))
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(75)
        self.label_Date.setFont(font)
        self.label_Date.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_Date.setObjectName("label_Date")
        self.btn_OpenCalendar = QtWidgets.QPushButton(self.centralwidget)
        self.btn_OpenCalendar.setGeometry(QtCore.QRect(80, 90, 191, 61))
        self.btn_OpenCalendar.setObjectName("btn_OpenCalendar")
        SecondWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(SecondWindow)
        self.statusbar.setObjectName("statusbar")
        SecondWindow.setStatusBar(self.statusbar)

        self.retranslateUi(SecondWindow)
        QtCore.QMetaObject.connectSlotsByName(SecondWindow)

    def retranslateUi(self, SecondWindow):
        _translate = QtCore.QCoreApplication.translate
        SecondWindow.setWindowTitle(_translate("SecondWindow", "MainWindow"))
        self.label_Date.setText(_translate("SecondWindow", "Date"))
        self.btn_OpenCalendar.setText(_translate("SecondWindow", "Open Calendar"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    SecondWindow = QtWidgets.QMainWindow()
    ui = Ui_SecondWindow()
    ui.setupUi(SecondWindow)
    SecondWindow.show()
    sys.exit(app.exec_())

第三(日历)窗口:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_CalendarWindow(object):
    def setupUi(self, CalendarWindow):
        CalendarWindow.setObjectName("CalendarWindow")
        CalendarWindow.resize(512, 458)
        self.centralwidget = QtWidgets.QWidget(CalendarWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.CalendarBox = QtWidgets.QCalendarWidget(self.centralwidget)
        self.CalendarBox.setGeometry(QtCore.QRect(20, 20, 464, 289))
        self.CalendarBox.setObjectName("CalendarBox")
        self.btn_Selecteddate = QtWidgets.QPushButton(self.centralwidget)
        self.btn_Selecteddate.setGeometry(QtCore.QRect(160, 330, 181, 60))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.btn_Selecteddate.setFont(font)
        self.btn_Selecteddate.setObjectName("btn_Selecteddate")
        CalendarWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(CalendarWindow)
        self.statusbar.setObjectName("statusbar")
        CalendarWindow.setStatusBar(self.statusbar)

        self.retranslateUi(CalendarWindow)
        QtCore.QMetaObject.connectSlotsByName(CalendarWindow)

    def retranslateUi(self, CalendarWindow):
        _translate = QtCore.QCoreApplication.translate
        CalendarWindow.setWindowTitle(_translate("CalendarWindow", "MainWindow"))
        self.btn_Selecteddate.setText(_translate("CalendarWindow", "Select"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    CalendarWindow = QtWidgets.QMainWindow()
    ui = Ui_CalendarWindow()
    ui.setupUi(CalendarWindow)
    CalendarWindow.show()
    sys.exit(app.exec_())

谢谢。 :)

python class oop pyqt pyqt5
1个回答
0
投票

FirstWindow.open_SecondWindow中,您无需为第二个窗口创建单独的QMainWindow对象。 SecondWindow()已经返回一个QMainWindow对象,该对象具有正确的UI设置,并且有一个插槽连接到btn_OpenCalendar以打开日历窗口。因此,执行以下操作就足够了:

def open_SecondWindow(self):
    self.window = SecondWindow()
    self.window.show()  
    self.setEnabled(False)
    self.window.setEnabled(True)
© www.soinside.com 2019 - 2024. All rights reserved.