为什么我需要创建 `QApplication` 的对象,它在 PyQt GUI 编程中的目的是什么?

Why do i need to create object of `QApplication` and what is the purpose of it in PyQt GUI programming?

def main():
    app = QtWidgets.QApplication(sys.argv)

    w = QtWidgets.QWidget()
    w.show()

    app.exec()

这是一个非常简单的 Python GUI 程序,具有 PyQt5 框架。其实我对Qt并不熟悉,也是GUI编程的新手。在上面的程序中,创建了一个 QApplication 的对象以及 QWidget。在这种情况下,app 对象不包含 w 对象,我看不到它们两者之间的任何联系。那么为什么有必要创建一个 QApplication 的对象并使用该对象执行它呢? 谢谢!

不需要 创建 QApplication,但它很方便 class 可以为您做很多事情。

我不会解释它可能为你做的所有事情——你会在 the manual 中找到——但我可以解释你在示例代码中所做的两件事。

app = QtWidgets.QApplication(sys.argv)

在这里您正在创建 QApplication,并将参数传递给它的构造函数。 Qt understands certain arguments 可以在执行应用程序时使用。

app.exec_()

正如您所说,appw 之间似乎没有任何互动。但是有联系!

为了让 Qt 的 GUI 发挥作用,它需要在主线程中有一个事件循环。调用 exec_() 启动此事件循环。

引用 QApplication::exec() 的文档:

Enters the main event loop and waits until exit() is called, then returns the value that was set to exit() (which is 0 if exit() is called via quit()).

It is necessary to call this function to start event handling. The main event loop receives events from the window system and dispatches these to the application widgets.

因此,一旦您调用 exec_(),控件就会离开您的 main() 函数并开始响应 UI 事件,直到您告诉它退出。

几乎所有桌面 GUI 都在某种程度上以这种方式工作,尽管并非所有桌面 GUI 都有一个很好的应用程序对象来为您设置事件循环。如果您是事件驱动编程的新手,您可能需要阅读这些概念。 This Wikipedia article 是个不错的起点。