启动时,我的Qt应用程序在显示主窗口之前会显示一个包含一些选项的对话框。该对话框具有“开始”和“取消”按钮。当用户单击“新游戏”按钮时,在显示主窗口之后,稍后会使用相同的对话框。
我试图让“取消”按钮退出应用程序,如果它是唯一显示的界面元素(即在应用程序启动时)。但是,在我当前的代码中,仍显示主窗口。
如果我self.view.destroy()
用self.view.deleteLater()
主窗口替换,则在消失(并正确退出)之前会短暂闪烁,但这不是解决方案。
如果我将view.show()
呼叫移到该dialog.exec_()
块内,那么它也不起作用。主要是因为view.show()
每次在主窗口中再次显示对话框时我都会打电话,而且还因为即使在这种情况下,应用程序并没有真正退出。在这种情况下,不会显示主窗口,但进程将继续运行(Python应用程序图标在Dock中仍然可见)。
我在这里做错了什么?我读过其他 类似的 问题,但是我不了解如何在我的情况下应用这些解决方案。
(在macOS 10.15.6上为PySide2 5.15.1)
class App:
def __init__(self, app, game, view):
self.app = app
self.game = game
self.view = view
# Display the dialog
# Same callback is bound to a QPushButton in MainWindow
self.cb_start_dialog()
def cb_start_dialog(self):
# Do some initialisation
dialog = DialogNewGame() # A subclass of QDialog
if dialog.exec_():
# Setup the interface
else:
if not self.view.isVisible():
# Condition evaluates correctly
# (False on app launch,
# True if main window is displayed)
self.view.destroy()
self.app.quit() # Doesn't work, main window still displayed
def main():
application = QApplication()
view = MainWindow() # A QWidget with the main window
model = Game() # Application logic
App(application, model, view)
view.show()
application.exec_()
如果对代码进行了很好的分析,则可以观察到在事件循环启动之前调用了“退出”,因此终止从未启动的事件循环是没有意义的。解决方案是在事件循环启动后立即调用X。另一方面,quit方法是静态的,因此不需要访问“ self.app”
from PySide2.QtCore import QTimer
from PySide2.QtWidgets import QApplication, QDialog, QMainWindow
class MainWindow(QMainWindow):
pass
class DialogNewGame(QDialog):
pass
class Game:
pass
class App:
def __init__(self, game, view):
self.game = game
self.view = view
QTimer.singleShot(0, self.cb_start_dialog)
def cb_start_dialog(self):
dialog = DialogNewGame()
if dialog.exec_():
pass
else:
QApplication.quit()
def main():
application = QApplication()
view = MainWindow()
model = Game()
app = App(model, view)
view.show()
application.exec_()
if __name__ == "__main__":
main()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句