【问题标题】:How QApplication() and QWidget() objects are connected in PySide/PyQt?QApplication() 和 QWidget() 对象在 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_())

这背后有什么魔力?

【问题讨论】:

    标签: python qt pyqt pyside


    【解决方案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() 以避免在创建/销毁许多QWidgets 时可能发生的不必要的开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2018-03-02
      • 2021-05-27
      • 1970-01-01
      相关资源
      最近更新 更多