所以我一直在爲我的Python應用程序創建我的GUI和Qt。現在我已經遇到了這樣一種情況:在按下按鈕之後,執行適當的延遲獲取,我們執行一些任務,然後我需要打開一個包含一兩個事物的單獨窗口。但我似乎無法弄清楚如何創建這個新的獨立窗口。任何人都可以給我一個如何創建一個例子嗎?Python:PyQt彈出窗口
18
A
回答
37
一個可以讓你瘋狂的常見錯誤是忘記存儲在一些將保持活動狀態的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(...))
。這樣做可以讓你打開幾個彈出窗口。
3
一般情況下,你只需顯示多個無父無母的窗戶,someQWidget.show()
,如:
w1 = QLabel("Window 1")
w2 = QLabel("Window 2")
w1.show()
w2.show()
但最有可能的,你想一個模式對話框的標準像this。另外請務必瞭解modal dialogs。
相關問題
- 1. 彈出窗口:當彈出彈出窗口時關閉彈出
- 2. 彈出窗口
- 3. Android彈出窗口在彈出窗口外彈出時解僱
- 4. 彈出式彈性窗口
- 5. 退出彈出式窗口與彈出式窗口
- 6. ie8彈出窗口
- 7. Javascript彈出窗口
- 8. 彈出窗口programmaticall
- 9. mvc彈出窗口
- 10. Javascript彈出窗口
- 11. javascript彈出窗口
- 12. mozilla彈出窗口
- 13. Android:彈出窗口
- 14. vb.net彈出窗口
- 15. PyQt5彈出窗口
- 16. 彈出Kendo窗口
- 17. eclipse彈出窗口
- 18. PHP:彈出窗口
- 19. Selenium - 彈出窗口
- 20. Android彈出窗口
- 21. Ajax彈出窗口
- 22. android彈出窗口
- 23. 彈出窗口內
- 24. Javascript彈出窗口
- 25. jquery彈出窗口
- 26. jquery彈出窗口
- 27. WPF彈出窗口
- 28. USB彈出窗口?
- 29. javascript彈出窗口
- 30. 在彈出窗口
如果使用Designer創建self.setupUi(self),則不要忘記將self.setupUi(self)添加到第二個窗口或小部件的__init__中。 – 2011-08-23 00:46:08