为啥在 PyQt5 中打开新窗口时我的应用程序会关闭?

Posted

技术标签:

【中文标题】为啥在 PyQt5 中打开新窗口时我的应用程序会关闭?【英文标题】:Why does my app close when opening a new window in PyQt5?为什么在 PyQt5 中打开新窗口时我的应用程序会关闭? 【发布时间】:2017-10-24 00:00:41 【问题描述】:

~EDIT(原来的问题还在下面)~当我在新窗口中删除 self.setGeometry() 调用时,它会正常工作。这是为什么?我仍在为它构建 UI,但是一旦我这样做了,我希望我不会继续遇到这个问题......

~EDIT 2~ 刚刚意识到应该是 self.resize() 而不是 self.setGeometry()...

self.solved()

:(

我只是在学习 PyQt5,只是在搞点乱。出于某种原因,当我尝试从主应用程序窗口打开一个新窗口时,整个事情都关闭了。放入一些打印语句来跟踪进度表明它实际上也没有创建新窗口。

主窗口代码:

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QApplication
from newLeague import *


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        newLeagueAction = QAction('Create New League', self)
        newLeagueAction.setShortcut('Ctrl+N')
        newLeagueAction.setStatusTip('Create a new league from scratch')
        newLeagueAction.triggered.connect(self.createNewLeague)

        openLeagueAction = QAction('Open Existing League', self)
        openLeagueAction.setShortcut('Ctrl+E')
        openLeagueAction.setStatusTip('Continue with a previously started league')
        openLeagueAction.triggered.connect(self.openExistingLeague)

        exitAction = QAction('Quit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Quit the application...')
        exitAction.triggered.connect(self.close)

        self.statusBar()

        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('&File')
        fileMenu.addAction(newLeagueAction)
        fileMenu.addAction(openLeagueAction)
        fileMenu.addAction(exitAction)

        self.resize(1920, 1080)
        self.setWindowTitle("Brackets")

    def createNewLeague(self):
        '''shows dialog to create a new league'''

        self.newLeague = CreateLeague()
        self.newLeague.show()
        print('New League being created...')

    def openExistingLeague(self):
        print('Existing League opening...')


def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

这是第二个窗口:

from PyQt5.QtWidgets import QMainWindow


class CreateLeague(QMainWindow):
    def __init__(self):
        super(CreateLeague, self).__init__()

        self.initUI()

    def initUI(self):
        self.setGeometry(600, 500)
        self.setWindowTitle('Create A New League')

我查看了其他示例,例如 this 和 this,但我没有看到我在做什么不同。我已经尝试在构造函数中使用 parent 作为参数,结果没有什么不同。

【问题讨论】:

【参考方案1】:

您的主窗口代码没有问题,但是您应该从第二个窗口中的 super 参数中删除 CreateLeague, self 参数,然后,您的代码应该可以正常工作。

见下文:

from PyQt5.QtWidgets import QMainWindow
class CreateLeague(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.resize(600, 500)
        self.setWindowTitle('Create A New League') 

【讨论】:

以上是关于为啥在 PyQt5 中打开新窗口时我的应用程序会关闭?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 - 在新窗口中打开 QMediaplayer 并播放视频

关闭并打开新窗口PYQT5

为啥单击按钮时我的 reactstrap 模式没有打开?

为啥在 Edge 中调试我的 asp.net core 2.0 应用程序时显示“您需要一个新应用程序才能打开此本地主机”弹出窗口?

无法在 Pyqt5 上保存我的窗口的大小和位置

无法在 PyQt5 中打开多个窗口