一个使您抓狂的常见错误是忘记将创建的弹出窗口的句柄存储在将保持活动状态的python变量中(例如,存储在主窗口的数据成员中)。
以下是一个简单的程序,该程序创建一个带有按钮的主窗口,按此按钮可打开一个弹出窗口
#!/usr/bin/env python#-*- coding: utf-8 -*-import sysfrom PyQt4.Qt import *class MyPopup(QWidget): def __init__(self): QWidget.__init__(self) def paintEvent(self, e): dc = QPainter(self) dc.drawLine(0, 0, 100, 100) dc.drawLine(100, 0, 0, 100)class MainWindow(QMainWindow): def __init__(self, *args): QMainWindow.__init__(self, *args) self.cw = QWidget(self) self.setCentralWidget(self.cw) self.btn1 = QPushButton("Click me", self.cw) self.btn1.setGeometry(QRect(0, 0, 100, 30)) self.connect(self.btn1, SIGNAL("clicked()"), self.doit) self.w = None def doit(self): print "Opening a new popup window..." self.w = MyPopup() self.w.setGeometry(QRect(100, 100, 400, 200)) self.w.show()class App(QApplication): def __init__(self, *args): QApplication.__init__(self, *args) self.main = MainWindow() self.connect(self, SIGNAL("lastWindowClosed()"), self.byebye ) self.main.show() def byebye( self ): self.exit(0)def main(args): global app app = App(args) app.exec_()if __name__ == "__main__": main(sys.argv)
我认为对于Python用户来说可能是令人惊讶的,可能是您面临的问题是,如果您没有在主目录中存储对新窗口小部件的引用,例如通过使用
w =MyPopup(...)而不是
self.w = MyPopup(...)窗口就不会出现(实际上是它创建后立即被销毁)。
原因是当局部变量
w超出范围时,因为没有人明确引用该窗口小部件,因此该窗口小部件被删除。可以清楚地看到这一点,因为如果再次按下该按钮,您将看到第二个弹出窗口出现时第一个弹出窗口被关闭。
这也意味着,如果您需要创建多个弹出窗口,则必须将其放入python列表中,并且一旦用户关闭了弹出窗口,便应将其从此列表中删除。该示例中的等效项可以更改为
self.w= []in构造函数,然后执行
self.w.append(MyPopup(...))。这样做将允许您打开几个弹出窗口。