Python: PyQt 弹出窗口
我正在用Qt为我的Python应用程序制作图形界面。现在我遇到了一个情况,就是在按下一个按钮后,相关的操作会被执行,我们完成一些任务后,我需要打开一个新的窗口,里面放一两个东西。但是我不知道怎么创建这个新的窗口。有没有人能给我一个创建窗口的例子?
2 个回答
55
一个常见的错误是忘记把你创建的弹出窗口的句柄存储在一个能一直存在的Python变量里,比如主窗口的一个数据成员。这可能会让你抓狂。
下面是一个简单的程序,它创建了一个主窗口,里面有一个按钮,按下这个按钮就会打开一个弹出窗口。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
from 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 = []
改成这样,然后用 self.w.append(MyPopup(...))
来添加新的弹出窗口。这样做就可以让你打开多个弹出窗口了。