PyQt:为啥新窗口在打开后立即关闭[重复]

Posted

技术标签:

【中文标题】PyQt:为啥新窗口在打开后立即关闭[重复]【英文标题】:PyQt: Why does new window close immediately after opening it [duplicate]PyQt:为什么新窗口在打开后立即关闭[重复] 【发布时间】:2017-02-15 11:04:43 【问题描述】:

我有一个主窗口,我想在按下按钮时打开另一个窗口(不是对话框)。我的问题是新窗口在打开后几乎立即关闭。我已经阅读了可用的文章,并尝试实施解决方案,但似乎没有运气。这是我的全部代码:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MainWindow (QMainWindow):
    def __init__(self):
        win = QWidget()
        win.adjustSize()
        grid=QGridLayout()
        grid.setRowStretch(0, 1)
        grid.setRowStretch(1, 1)
        grid.setRowStretch(5, 1)
        for i in range(0,5):
            for j in range(0,4):
                if i==0 and j==2:
                    l1=grid.addWidget(QLabel("Choose an option:"),i,j, 2, 2)
                if i==2 and j==1:
                    b1= QPushButton("Get Best Match")
                    grid.addWidget(b1,i,j)
                elif i==2 and j==2:
                    b2=QPushButton("Button2")
                    grid.addWidget(b2,i,j)
                elif i==2 and j==3:
                    b3=QPushButton("Button3")
                    grid.addWidget(b3,i,j)
        b5=grid.addWidget(QLabel(""),3,4) 
        b4=QPushButton("Button4")
        grid.addWidget(b4,2,4)
        w1=b1.clicked.connect(window1)
        b2.clicked.connect(Win2)
        b3.clicked.connect(Win3)
        b4.clicked.connect(Win4)            
        win.setLayout(grid)
        win.setGeometry(100,100,width//2,height//2,)
        win.setWindowTitle("PYQT")
        win.show()
        win.setStyleSheet("""
        .QPushButton 
        height: 30px ;
        width: 20px ; 
        
        .QLabel 
        qproperty-alignment: AlignCenter;
        font-size:12pt
         

         """)
        sys.exit(app.exec_())

class window1():
    def __init__(self, pressed):
        super(window1, self).__init__()
        win1 = QWidget()
        win1.adjustSize()
        win1.setGeometry(100,100,width//2,height//2,)
        win1.setWindowTitle("Get Best Match")
        win1.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    screen_resolution = app.desktop().screenGeometry()
    width, height = screen_resolution.width(), screen_resolution.height()
    main=MainWindow()

有人可以帮我解决这个问题吗?我已经卡了一段时间了。

【问题讨论】:

这能回答你的问题吗? PyQt window closes immediately after opening 【参考方案1】:

窗口正在消失,因为它在您的 __init__ 函数结束时超出了范围。由于没有进一步的引用,python 垃圾收集器将其删除。

通常 PyQt 对象保留对其子对象的引用,因此这不是问题。由于您希望小部件在单独的窗口中打开,因此您不能为其分配父级,因此您需要在其他地方存储对它的引用。显而易见的候选者是 MainWindow 类。

您可以使用self.win = QWidget() 代替win = QWidget() 使win 成为MainWindow 的成员。该窗口现在将在 MainWindow 的生命周期内保持打开状态,除非您将其关闭。

您的代码还有其他问题,但这解释了窗口消失的原因。

【讨论】:

我的问题是,当我单击 GetBestMatch 按钮时,新窗口仅打开一秒钟,然后关闭。但主窗口始终保持打开状态(我想要)。我实施了您建议的更改,但似乎不起作用 好的,不清楚您指的是哪个窗口。仔细检查你的问题是双重的。首先,您遇到的问题与我在“获取最佳匹配”按钮引用的 window1 类中描述的问题相同。另一个问题是您在连接信号时传递了类名。这实质上是将类构造函数作为插槽传递,它再次丢弃新创建的窗口。您需要连接到创建窗口并存储引用的函数 另外,app.exec_() 内部的 sys.exit(app.exec_()) 启动 Qt 事件循环。它不应该在任何类中。将其移至代码末尾 嗨@user3419537 你能解释一下代码中的调整吗?以便我更好地理解。我确实尝试将 sys.exit(app.exec_()) 移动到 if name =main 部分,然后甚至主窗口在打开后关闭。另外,我将 self 添加到 window1 代码中,也没有更改输出

以上是关于PyQt:为啥新窗口在打开后立即关闭[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 新窗口实例立即显示和关闭

PyQt 窗口在打开后立即关闭

PyQt QWidget 窗口在显示后立即关闭?

关闭并打开新窗口PYQT5

PyQt 窗口在打开后关闭

PyQt5,单击按钮后如何打开新窗口