PyQt:为什么新窗口在打开后立即关闭
问题描述:
我有一个主窗口,我想在按钮按下时打开另一个窗口(不是对话框)。我的问题是新窗口打开后几乎立即关闭。我已经阅读了可用的文章,并试图实施解决方案,但似乎没有运气。这是我的整个代码:PyQt:为什么新窗口在打开后立即关闭
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()
有人可以帮我这个吗?我一直在困扰一段时间。
答
窗口正在消失,因为它在__init__
函数的末尾超出了范围。由于没有进一步的引用,python垃圾收集器将其删除。
通常PyQt对象保持对其子的引用,所以这不是问题。由于您希望小部件在单独的窗口中打开,因此您无法将其分配给父项,因此您需要在其他位置存储对其的引用。明显的候选人是MainWindow
类。
通过使用self.win = QWidget()
而不是win = QWidget()
,可以使win
成为MainWindow
的成员。除非您关闭它,否则此窗口将在MainWindow
的整个生命周期内保持打开状态。
您的代码存在其他问题,但这解释了窗口消失的原因。
我的问题是,当我点击按钮GetBestMatch,新窗口打开了第二个,然后关闭。但主窗口始终保持打开状态(我想要的)。我实施了您所建议的更改,但似乎没有工作 – Sarah
好的,您不清楚您指的是哪个窗口。仔细检查你的问题是双重的。首先,您遇到了与我在“get best match”按钮引用的'window1'类中描述的相同的问题。另一个问题是在连接信号时你传递了类名。这基本上是将类构造函数作为一个插槽传递,它再次丢弃新创建的窗口。您需要连接到一个创建窗口并存储引用的函数 – user3419537
此外,'sys.exit(app.exec _())'内的'app.exec _()'启动Qt事件循环。它不应该在任何班级内。将它移动到代码的末尾 – user3419537