PyQt:为什么新窗口打开后立即关闭?

7

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

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()

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


1
这个回答解决了你的问题吗?PyQt窗口打开后立即关闭 - user202729
1个回答

24

窗口消失是因为它在__init__函数结束时超出了范围。由于没有对它的进一步引用,Python垃圾回收器将其移除。

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

您可以通过使用self.win = QWidget()而不是win = QWidget()来将win作为MainWindow的成员。除非您关闭它,否则该窗口现在将保持打开状态,直到MainWindow的生命周期结束。

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


我的问题是,当我点击GetBestMatch按钮时,新窗口只会打开一秒钟就关闭了。但是主窗口始终保持打开状态(这正是我想要的)。我已经按照您建议的更改进行了实现,但似乎没有起作用。 - Sarah
好的,不清楚你指的是哪个窗口。仔细检查后,发现你的问题有两个。首先,你在“window1”类中遇到了与我描述的相同的问题,该类被“get best match”按钮引用。另一个问题是,在连接信号时传递了类名。这本质上是将类构造函数作为插槽传递,这又一次丢弃了新创建的窗口。你需要连接到一个创建窗口并存储引用的函数。 - user3419537
另外,在 sys.exit(app.exec_()) 中的 app.exec_() 开始了 Qt 事件循环。它不应该在任何类中。将其移动到代码末尾。 - user3419537
嗨@user3419537,您能否通过代码中的微调来解释一下?这样我会更好地理解。我尝试将sys.exit(app.exec_())移动到if name = main部分,然后主窗口甚至在打开后也关闭了。此外,我在window1代码中添加了self,并没有改变输出结果。 - Sarah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接