在我的PyQt应用中应该使用`app.exec()`还是`app.exec_()`?

61 投票
3 回答
36524 浏览
提问于 2025-04-17 23:39

我使用的是Python 3和PyQt5。下面是我的测试PyQt5程序,重点看最后两行:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys

class window(QWidget):
def __init__(self,parent=None):
    super().__init__(parent)
    self.setWindowTitle('test')
    self.resize(250,200)

app=QApplication(sys.argv)
w=window()
w.show()
sys.exit(app.exec())
#sys.exit(app.exec_())

我知道exec是Python中的一个关键字。但是在官方PyQt5文档中,特别是退出时对象销毁的部分,看到的例子中使用了app.exec(),这让我有点困惑。

我在我的机器上测试了一下,发现无论是用app.exec()还是不加下划线的app.exec,输出结果没有任何可见的区别,时间上也没有差别。

我的问题是:

  • 使用app.exec()时是否有什么问题?会不会和Python内部的exec冲突?我怀疑因为这两个exec都在执行某些东西。
  • 如果没有,我可以互换使用这两个吗?

3 个回答

2

从PyQt 6开始,app.exec_()这个方法不再被支持了,现在只能使用app.exec()

所以,在创建新应用的时候,我只会用后者。

https://www.riverbankcomputing.com/static/Docs/PyQt6/pyqt5_differences.html?highlight=pyqt5

9

为了让大家更清楚,这里是截至2023年10月的最新情况:

  • PyQt6:只支持 exec
  • PySide6:同时支持 execexec_
  • PyQt5:同时支持 execexec_
  • PySide2:只支持 exec_

还要指出的是,这个情况不仅影响 QApplication 类,还影响很多其他类,比如 QMenuQDialogQThread 等等。

所以,往后就不需要再使用 exec_ 了,除非你想支持 PySide2,或者下面提到的过时版本的 Qt 和 Python。

(注意:标准的 Qt5 LTS 支持在2023年5月结束,虽然 商业支持延长到2025年5月。不过,Qt5 的实际使用寿命可能会超过这个时间,因为 KDE 仍在根据原始的 Qt 开源许可证进行补丁回溯。)


更新:

由于 PyQt4/Qt4 和 Python2 现在已经过时,下面这部分内容就不再相关:

关于是否偏好使用其中一个的问题:使用 exec_ 意味着如果你决定添加对 PyQt4 和/或 Python >= 2.6 的支持,你就少了一件需要担心的事情,并且可以保持代码的统一。

115

这是因为在Python 3之前,exec是一个保留关键字,所以PyQt的开发者在它后面加了个下划线。从Python 3开始,exec就不再是保留关键字了(因为它是一个内置函数,和print的情况一样),所以在PyQt5中,提供了一个没有下划线的版本,以便和C++的文档保持一致,同时为了向后兼容,保留了带下划线的版本。因此,在使用Python 3的PyQt5中,这两个exec函数是一样的。而在旧版的PyQt中,只有exec_()这个版本可用。

撰写回答