【问题标题】:How to work with multiple windows in PyQt5? Passing Values through multiple windows and Calling Modules in Other Modules如何在 PyQt5 中使用多个窗口?通过多个窗口传递值和调用其他模块中的模块
【发布时间】:2020-01-27 08:15:39
【问题描述】:

我用 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】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      相关资源
      最近更新 更多