如何在PySide / PyQt中连接QApplication()和QWidget()对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PySide / PyQt中连接QApplication()和QWidget()对象?相关的知识,希望对你有一定的参考价值。

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

这背后的魔力是什么?

答案

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;
}

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

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

以上是关于如何在PySide / PyQt中连接QApplication()和QWidget()对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt/PySide 中获取 QPalette 的组和角色?

如何在 Qt/PyQt/PySide 中找到当前的 QLocale?

如何在 PyQt/PySide 中获取删除的文件名

PySide/PyQT5:如何从 QGraphicsItem 发出信号?

如何显示 PySide/PyQt UI 并自动运行其中一种方法?

模型中 dropActions 的访问值 (PySide/PyQt/Qt)