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