2013-04-25 34 views
5

Tôi vừa bắt đầu sử dụng pyqt4. Tôi đi theo một hướng dẫn (http://zetcode.com/tutorials/pyqt4/) Một điều mà tôi bối rối là phần này:Nhiều cửa sổ trong PyQt4?

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = GUI() 
    sys.exit(app.exec()) 

Và lý do cho điều này tôi giải thích ở đây:

Tôi đã thực hiện một chương trình nhỏ mà mở bốn cửa sổ hơn trừ cửa sổ chính đầu tiên. Vì vậy, tôi đã cố gắng để nhân rộng những gì tôi thấy làm việc với cửa sổ chính và tạo ra một lớp học cho mỗi cửa sổ mới và cố gắng làm như với ở trên. Hiện tại có vẻ như sau:

def main2(): 
    #app = QtGui.QApplication(sys.argv) 
    ex2 = Settings() 
    sys.exit(app.exec()) 

Như bạn có thể thấy tôi đã sửa đổi nó. Nếu tôi để dòng đầu tiên trong hàm uncommented chương trình sẽ sụp đổ. Tôi đã cố gắng làm mà không có sys.exit (app.exec_()) -part nhưng điều đó sẽ chỉ làm cho cửa sổ mới đóng mili giây sau khi nó được hiển thị. Bằng cách này, mọi thứ đều chạy và hoạt động. Chỉ có điều đó trong cửa sổ lệnh, một thông báo lỗi hiển thị. Tôi không biết cách khắc phục điều này, vì tôi không thể xóa dòng cuối cùng và tôi không biết phải thay thế "ứng dụng" bằng.

Tôi biết tôi có thể làm cửa sổ mới sai ngay từ đầu, nhưng tôi không biết cách làm cho các cửa sổ này mở ra từ cửa sổ gốc theo bất kỳ cách nào khác. Tôi đã không thể có được bất cứ điều gì khác để làm việc, và điều này ít nhất là chạy và hoạt động ngay bây giờ. Vì vậy, vấn đề duy nhất là thông báo lỗi trong lời nhắc, nó sẽ là tốt đẹp để loại bỏ chúng :)

Cảm ơn bạn đã giúp đỡ (những người phức tạp và dễ dàng)!

Quên đề cập đến, tôi đã thực hiện các lớp học bắt đầu như thế này:

class GUI(QtGui.QMainWindow): 
    def __init__(self): 
     super(GUI, self).__init__() 
     self.initUI() 

class Settings(QtGui.QWidget): 
    def __init__(self): 
     super(Settings, self).__init__() 
     ...here goes some more... 
     self.initUI2() 

và tôi mở Cài đặt cửa sổ bằng cách gọi main2()

Trả lời

6

Bạn phải tạo một và chỉ có một QApplication trong chương trình của bạn.

Hãy nhớ rằng lập trình GUI là hướng sự kiện, trước tiên bạn khai báo tiện ích con và sau đó chạy vòng lặp chính với app.exec(), khi người dùng thoát ứng dụng của bạn, trả lại app.exec().

Mục đích QApplication là xử lý các sự kiện của người dùng và truyền bá chúng đến mã của bạn bằng tín hiệu Qt. Tôi đề nghị bạn kiểm tra Qt documentation, nó rất hoàn chỉnh, ngay cả khi nó nhắm mục tiêu lập trình C++.

Vì vậy, ví dụ, một cách để tạo ra hai widget sẽ là:

def main(): 
    app = QtGui.QApplication(sys.argv) 

    ex = QtGui.QWidget() 
    ex.show() 
    ex2 = QtGui.QWidget() 
    ex2.show() 

    sys.exit(app.exec()) 
+0

Cảm ơn bạn, điều đó rõ ràng một số điều. Nhưng tôi không thể hiển thị tất cả các cửa sổ cùng một lúc. Đầu tiên là QMainWindow sẽ hiển thị khi khởi động, và từ đó nó phụ thuộc vào những gì sẽ mở, vì tôi có thể chọn các tùy chọn khác nhau trong thanh thực đơn. Ví dụ: cửa sổ trợ giúp hoặc cửa sổ cài đặt. –

+1

@right_there: bạn cần tạo (hoặc ít nhất là hiển thị) cửa sổ cài đặt của bạn để phản hồi sự kiện, xem hướng dẫn bạn theo dõi về các sự kiện: http://zetcode.com/tutorials/pyqt4/eventsandsignals/ – Julien

+0

Ồ, tôi ' đã làm điều đó! Tôi chỉ không muốn đặt tất cả các mã ở đây, nó giống như 560 dòng. Tôi đã có tất cả làm việc, cửa sổ mở khi tôi nhấp vào nút.Tôi có một giao diện đẹp với thanh thực đơn, tôi đã sắp xếp tất cả các nút trong settingswindow vv Nó chỉ là nó ném thông báo lỗi về những gì tôi mô tả trong bài đầu tiên, và tôi không biết làm thế nào để thay đổi tất cả. Có lẽ tôi nên cung cấp thêm một số mã ở đây? –

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