所以我一直用我的Python应用程序用Qt创建GUI。我现在遇到这样一种情况:按下按钮后执行适当的延迟执行,我们执行一些任务然后我需要打开一个包含一两件事的单独窗口。但我似乎无法弄清楚如何创建这个新的单独窗口。谁能给我一个如何创建一个的例子?
答案 0 :(得分:43)
一个让你疯狂的常见错误是忘记将你创建的弹出窗口的句柄存储在一些仍然存活的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(...))
。这样做可以让你打开几个弹出窗口。
答案 1 :(得分:3)
通常,您只需使用someQWidget.show()
显示多个无父窗口,例如:
w1 = QLabel("Window 1")
w2 = QLabel("Window 2")
w1.show()
w2.show()
但最有可能的是,你想要一个像this这样的模态标准对话框。另外请务必了解modal dialogs。