QApplication() 和 QWidget() 对象在 PySide/PyQt 中是如何连接的?
Posted
技术标签:
【中文标题】QApplication() 和 QWidget() 对象在 PySide/PyQt 中是如何连接的?【英文标题】:How QApplication() and QWidget() objects are connected in PySide/PyQt? 【发布时间】:2013-07-11 19:35:41 【问题描述】: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_())
这背后有什么魔力?
【问题讨论】:
【参考方案1】:QApplication
是一个单例,所以对于QWidget
来说,这很容易做到:QApplication.instance()
并与 QApplication
实例交互。
实际上尝试在QApplication
之前实例化QWidget
会导致错误:
>>> 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;
其中qApp
是指向QApplication
实例的指针(即相当于调用QApplication.instance()
)。
因此,最终,QWidget
通过全局变量与QApplication
交互,尽管这不是必需的。他们可能使用qApp
而不是QApplication.instance()
以避免在创建/销毁许多QWidget
s 时可能发生的不必要的开销。
【讨论】:
以上是关于QApplication() 和 QWidget() 对象在 PySide/PyQt 中是如何连接的?的主要内容,如果未能解决你的问题,请参考以下文章
QWidget 键盘事件 焦点(QApplication源码)
qml systemtrayicon 没有 qwidget/qapplication?
必须在传递给 C 运行时函数的 QWidget 和无效参数之前构造一个 QApplication