Python:PyQt弹出窗口

Mor*_*ine 22 python pyqt

所以我一直用我的Python应用程序用Qt创建我的GUI.我现在遇到这样一种情况:按下按钮后执行适当的延迟执行,我们执行一些任务然后我需要打开一个包含一两件事的单独窗口.但我似乎无法弄清楚如何创建这个新的单独窗口.谁能给我一个如何创建一个的例子?

650*_*502 45

一个可以让你发疯的常见错误是忘记将你创建的弹出窗口的句柄存储在一些将保持活动的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)
Run Code Online (Sandbox Code Playgroud)

我认为Python用户可能会感到惊讶,可能是你面临的问题是如果你没有在主要中存储对新小部件的引用,例如通过使用w = MyPopup(...)而不是self.w = MyPopup(...)窗口显然不会出现(实际上它已经创建并立即被销毁了).

原因是当局部变量w超出范围时,因为没有人明确引用窗口小部件,窗口小部件会被删除.这可以清楚地看到,因为如果再次按下按钮,您将看到第二个弹出窗口显示第一个弹出窗口关闭.

这也意味着如果你需要创建几个弹出窗口,例如将它们放在python列表中,一旦弹出窗口被用户关闭,你应该从这个列表中删除它们.示例中的等效项可能会self.w = []在构造函数中更改为然后执行self.w.append(MyPopup(...)).这样做可以让你打开几个弹出窗口.