关闭 window 使用 QStackedWidget 制作

Close window made with QStackedWidget

我正在使用 PyQT 库开发一个用 Python 编写的软件。我想在“文件”菜单中执行“退出”命令。相关代码部分:

class Interface (QMainWindow):
    def __init__(self):
        super(Interface, self).__init__()
        loadUi("interface.ui", self)
        self.conectarSinais()

    def conectarSinais(self):      
        #menu
        self.actionSair.triggered.connect(self.fecharPrograma)
   
    def fecharPrograma(self):
        self.close()

 app = QApplication(sys.argv)
 JanelaPrincipal = Interface()
 widget = QtWidgets.QStackedWidget()
 widget.addWidget(JanelaPrincipal)
 widget.show()
 sys.exit(app.exec_())

Obs:“self.actionSair”是我在QT Designer中为动作赋予的对象名称,我在其中创建了“interface.ui”文件。当软件运行时,它会正确显示菜单并正确单击它会调用“fecharPrograma”插槽:

文件菜单工作:

但是,当点击“Sair”(退出)时,似乎只有QStackedWidget被关闭,留下一片空白: 空白屏幕而不是关闭 window:

如何在单击“Sair”(退出)菜单时正确关闭整个程序?

您正在 Interface 实例上调用 self.close(),这就是尝试将堆叠小部件用作“main window”时的问题,正如一些教程不幸建议的那样,这通常是一个糟糕的建议(特别是如果要添加的小部件是 QDialog 或 QMainWindow)。[1]

在这种情况下,解决方案是在顶层调用 close window:

    def fecharPrograma(self):
        self.window().close()

实际情况是“main window”(堆叠小部件)也应该是一个子类,它实现来自其任何子级的信号以关闭自身。请注意,在这种情况下,我还更改了 Interface 的继承,因为为此目的使用 QMainWindow 毫无意义。

class Interface(QWidget):
    closeRequest = pyqtSignal()
    # ...
    def conectarSinais(self):      
        #menu
        self.actionSair.triggered.connect(self.closeRequest)

class MainWindow(QStackedWidget):
    def __init__(self):
        super().__init__()
        self.janelaPrincipal = Interface()
        self.addWidget(self.janelaPrincipal)
        self.janelaPrincipal.closeRequest.connect(self.close)


app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())

[1] - 我已经联系了该教程的作者,以便就此问题和许多其他 错误提出 许多 更正建议 提供了建议,但不幸的是我没有得到回应。请注意,虽然从概念上讲该教程并没有 糟糕,但有许多方面被忽略或造成误解。我建议你寻找替代资源。