如何在PyQt的主窗口中打开和关闭新窗口?

时间:2018-07-18 06:46:41

标签: pyqt5 new-window

我在Google中搜索的内容通常都是关于如何打开新窗口而不是指示如何关闭窗口的帖子。我在该网站上发现了几篇文章,但大多数文章都使用对话框窗口,而我的软件中没有考虑这些问题。

我制作了一个UI,其中包含一个旋转框和一个按钮,以演示我的问题。我可以在旋转框中输入等于或小于5的数字。当我单击按钮时,将显示许多新窗口,并且将显示多少个窗口取决于旋转框中的数目。如果更改为旋转框中的数字,然后单击按钮,则原始窗口将关闭,并显示新窗口。

Fox示例,首先我在旋转框中输入“ 2”,然后单击按钮。然后将显示2个新窗口。如果我将旋转框中的数字更改为3,然后单击按钮,则原来的2个窗口将关闭,并且将显示3个新窗口。

这是我的主要程序代码:

from PyQt5.QtWidgets import QApplication, QMainWindow
from uitest_review import Ui_MainWindow  # import the UI module

# set up a class for main window
class window(QMainWindow):
    def __init__(self, parent=None):
        super(window, self).__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.Open.clicked.connect(self.openwindow)

    def openwindow(self):
        windownum = self.ui.windownum.value()
        print("open window num:", windownum)
        opennewwindow = newwindow(self)
        opennewwindow.show()

class newwindow(QMainWindow):
    def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")

if __name__ == "__main__":
    app = QApplication([])
    gui = window()
    gui.show()
    app.exec_()

这是我的UI代码:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(816, 577)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setObjectName("scrollArea")
        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 796, 537))
        self.scrollAreaWidgetContents.setObjectName(\
        "scrollAreaWidgetContents")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        spacerItem = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        self.verticalLayout.addItem(spacerItem)
        self.windownum = QtWidgets.QSpinBox(self.scrollAreaWidgetContents)
        self.windownum.setMaximum(5)
        self.windownum.setObjectName("windownum")
        self.verticalLayout.addWidget(self.windownum)
        self.groupBox = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
        self.groupBox.setTitle("")
        self.groupBox.setObjectName("groupBox")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox)
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem1)
        self.Open = QtWidgets.QPushButton(self.groupBox)
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.Open.setFont(font)
        self.Open.setObjectName("Open")
        self.horizontalLayout.addWidget(self.Open)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem2)
        self.verticalLayout.addWidget(self.groupBox)
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.gridLayout.addWidget(self.scrollArea, 0, 0, 1, 1)
        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.Open.setText(_translate("MainWindow", "Open"))


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_())

我在主程序中创建一个新类(newwindow),可以调用该类以显示一个新窗口。但是我不知道如何检测打开了多少窗口以及如何关闭它们。有人可以帮助我吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

我自己弄清楚了。

class window(QMainWindow):
    def __init__(self, parent=None):
        super(window, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.Open.clicked.connect(self.openwindow)
        self.openedwin = []

    def openwindow(self):
        windownum = self.ui.windownum.value()
        if windownum != 0:
            if self.openedwin != []:
                for window in self.openedwin:
                    window.close()
            for repeat in range(windownum):
                opennewwindow = newwindow(self)
                # print("opennewwindow:", opennewwindow)
                self.openedwin.append(opennewwindow)
                opennewwindow.show()
        # print("self.openedwin:", self.openedwin)


class newwindow(QMainWindow):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")

if __name__ == "__main__":
    app = QApplication([])
    gui = window()
    gui.show()
    app.exec_()

我添加一个列表self.openedwin = []保存所有窗口对象。我可以使用“ window object” .close()命令在打开新窗口之前关闭窗口。