2011-01-29 49 views
18

Vì vậy, tôi đã tạo GUI với Qt cho ứng dụng Python của mình. Bây giờ tôi đã đi đến một tình huống mà sau khi một nút đã được đẩy hoãn thích hợp được thực hiện, chúng tôi thực hiện một số nhiệm vụ sau đó tôi cần phải mở ra một cửa sổ riêng biệt có chứa một hoặc hai điều. Nhưng tôi không thể tìm ra cách để tạo ra cửa sổ riêng biệt mới này. Bất cứ ai có thể cho tôi một ví dụ về làm thế nào để tạo ra một?Python: Cửa sổ bật lên PyQt

Trả lời

37

Lỗi phổ biến có thể khiến bạn phát điên là lưu trữ tay cầm của cửa sổ bật lên mà bạn tạo trong biến số python sẽ vẫn còn sống (ví dụ: trong thành viên dữ liệu của cửa sổ chính).

Sau đây là một chương trình đơn giản mà tạo ra một cửa sổ chính với một nút nơi nhấn vào nút mở một popup

#!/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) 

Những gì tôi nghĩ có thể gây ngạc nhiên cho người dùng Python và có thể là vấn đề bạn đang phải đối mặt là thực tế là nếu bạn không lưu trữ tham chiếu đến tiện ích mới trong ví dụ chính bằng cách sử dụng w = MyPopup(...) thay vì self.w = MyPopup(...), cửa sổ dường như không xuất hiện (thực tế nó được tạo và bị phá hủy ngay lập tức).

Lý do là khi biến cục bộ w vượt quá phạm vi vì không có ai rõ ràng tham chiếu đến tiện ích con, tiện ích sẽ bị xóa. Điều này có thể được nhìn thấy rõ ràng bởi vì nếu bạn nhấn một lần nữa nút bạn sẽ thấy rằng khi popup thứ hai xuất hiện đầu tiên được đóng lại. Điều này cũng có nghĩa là nếu bạn cần tạo một số cửa sổ bật lên bạn có ví dụ để đặt chúng trong danh sách python và bạn nên xóa chúng khỏi danh sách này khi cửa sổ bật lên được người dùng đóng lại. Tương đương trong ví dụ có thể thay đổi thành self.w = [] trong hàm tạo và sau đó thực hiện self.w.append(MyPopup(...)). Làm như vậy sẽ cho phép bạn mở nhiều cửa sổ bật lên.

+0

Đừng quên thêm self.setupUi (tự) vào __init__ của cửa sổ thứ 2 hoặc tiện ích nếu bạn đã tạo nó bằng Trình thiết kế. –

3

Nói chung, bạn chỉ cần hiển thị nhiều cửa sổ côi với someQWidget.show(), như:

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

Nhưng rất có thể, bạn muốn có một tiêu chuẩn Dialog modal như this. Ngoài ra hãy chắc chắn để hiểu modal dialogs.

Các vấn đề liên quan