2013-07-11 37 views
7

Cách QApplication() và QWidget() được kết nối?Các đối tượng QApplication() và QWidget() được kết nối như thế nào trong PySide/PyQt?

Đây là mã ví dụ mà tôi đã sao chép, nó tạo đối tượng QApplication và đối tượng QWidget, nhưng không có liên kết giữa hai đối tượng. Tôi mong đợi một cái gì đó như app.setWidget(did) để dạy PySide/PyQt điều khiển về các widget đã được tạo ra.

# http://zetcode.com/gui/pysidetutorial/firstprograms/ 
# 1. PySide.QtGui is the class 
import sys 
from PySide import QtGui 

# 2. setup the application 
app = QtGui.QApplication(sys.argv) 

# 3. create the widget and setup 
wid = QtGui.QWidget() 
wid.resize(250, 150) 
wid.setWindowTitle('Simple') 

# 4. Show the widget 
wid.show() 

# 5. execute the app 
sys.exit(app.exec_()) 

Điều kỳ diệu đằng sau điều này là gì?

Trả lời

8

QApplication là một singleton để nó có thể dễ dàng, cho QWidget để làm: QApplication.instance() và tương tác với phiên bản QApplication.

Trong thực tế cố gắng để nhanh chóng QWidget trước QApplication dẫn đến một lỗi:

>>> QtGui.QWidget() 
QWidget: Must construct a QApplication before a QPaintDevice 

nào có thể có nghĩa đây là những gì sẽ xảy ra.


Edit: Tôi đã tải các nguồn qt và trên thực tế, trong src/gui/kernel/qwidget.cpp, đường 328, có:

if (!qApp) { 
    qFatal("QWidget: Must construct a QApplication before a QPaintDevice"); 
    return; 
} 

đâu qApp là một con trỏ đến QApplication dụ (tức là nó tương đương với số điện thoại QApplication.instance()).

Vì vậy, cuối cùng, QWidget tương tác với QApplication qua biến toàn cục, mặc dù không cần thiết. Họ có thể sử dụng qApp thay vì QApplication.instance() để tránh chi phí không cần thiết có thể xảy ra khi tạo/phá hủy nhiều QWidget s.

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