11

QApplication() 和 QWidget() 是如何连接的?

这是我复制的示例代码,它创建了 QApplication 对象和 QWidget 对象,但是这两个对象之间没有链接。我期望像app.setWidget(did)教 PySide/PyQt 控制器有关创建的小部件的东西。

# 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_())

这背后有什么魔力?

4

1 回答 1

12

QApplication是一个单例,所以它很容易QWidget做:QApplication.instance()并与QApplication实例交互。

实际上尝试在导致错误QWidget之前实例化:QApplication

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

这可能意味着这就是发生的事情。


编辑:我已经下载了 qt 源代码,事实上,在src/gui/kernel/qwidget.cpp第 328 行,有:

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

whereqApp是指向QApplication实例的指针(即它相当于调用QApplication.instance())。

因此,最终,即使没有必要,也可以通过全局变量QWidget与 进行交互。QApplication他们可能使用qApp而不是QApplication.instance()避免在创建/销毁许多QWidgets 时可能发生的不必要的开销。

于 2013-07-11T19:57:56.973 回答