【问题标题】:Close window made with QStackedWidget关闭使用 QStackedWidget 制作的窗口
【发布时间】:2021-09-29 20:04:39
【问题描述】:

我正在使用 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,并留下了一个空白屏幕: 空白屏幕而不是关闭窗口:

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

【问题讨论】:

    标签: python user-interface pyqt pyqt5


    【解决方案1】:

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

    在这种情况下,解决方法是在顶层窗口调用close

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

    现实情况是,“主窗口”(堆叠的小部件)也应该是一个子类,它实现来自其任何子级的信号以关闭自身。请注意,在这种情况下,我还更改了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] - 我已经联系了该教程的作者,以便提出许多关于此问题的更正以及所提供的许多其他错误建议,但不幸的是我没有得到回应。请注意,虽然从概念上讲,该教程并没有那么那么糟糕,但仍有许多方面被忽略或产生误解。我建议你寻找其他来源。

    【讨论】:

    • 谢谢@musicamante!我在命令中添加了“.window()”,它运行良好。现在我将尝试改进代码设计以解决继承问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2018-01-19
    • 2020-08-29
    相关资源
    最近更新 更多