Python:PyQt弹出窗口

Python:PyQt弹出窗口,python,pyqt,Python,Pyqt,因此,我一直在为我的Python应用程序使用Qt创建GUI。我现在遇到了这样一种情况,在按下一个按钮之后,执行相应的延迟,我们执行一些任务,然后我需要打开一个单独的窗口,其中包含一个或两个内容。但我似乎不知道如何创建这个新的单独窗口。有谁能给我一个如何创建一个的例子吗?通常,您只需使用someQWidget.show()显示多个无父窗口,如: w1 = QLabel("Window 1") w2 = QLabel("Window 2") w1.show() w2.show() 但最有可能的情况

因此,我一直在为我的Python应用程序使用Qt创建GUI。我现在遇到了这样一种情况,在按下一个按钮之后,执行相应的延迟,我们执行一些任务,然后我需要打开一个单独的窗口,其中包含一个或两个内容。但我似乎不知道如何创建这个新的单独窗口。有谁能给我一个如何创建一个的例子吗?

通常,您只需使用
someQWidget.show()
显示多个无父窗口,如:

w1 = QLabel("Window 1")
w2 = QLabel("Window 2")
w1.show()
w2.show()

但最有可能的情况是,您需要一个模式标准对话框,如。另外,请务必理解。

一个常见的错误可能会让您发疯,那就是忘记将您创建的弹出窗口句柄存储在一些将保持活动状态的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(…)
。这样做将允许您打开几个弹出窗口。

如果您使用Designer创建了第二个窗口或小部件,请不要忘记将self.setupUi(self)添加到该窗口或小部件的init中。