python-3.x 我应该在PyQt应用程序中使用`app.exec()`还是`app.exec_()`?

hwamh0ep  于 2023-10-21  发布在  Python
关注(0)|答案(3)|浏览(192)

我使用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文档 * 上的代码(特别是Object Destruction on Exit部分)*。我看到这个例子显示了app.exec()的使用,这让我很困惑。
当我在我的机器上测试的时候。我发现从我的Angular 看没有任何明显的区别。无论有没有_,都能在没有时间差的情况下产生相同的输出。
我的问题是:

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

ca1c2owp1#

这是因为在Python 3之前,exec是一个保留关键字,所以PyQt开发人员为其添加了下划线。从Python 3开始,exec不再是保留关键字(因为它是一个内置函数;与print相同的情况),因此在PyQt 5中提供一个没有下划线的版本以与C++文档保持一致,但保留一个带有下划线的版本以向后兼容。所以对于PyQt 5和Python 3,这两个exec函数是相同的。对于旧版PyQt,只有exec_()可用。

gcuhipw9

gcuhipw92#

为了完整起见,以下是目前的情况(截至2023年10月):

  • PyQt 6:仅支持exec
  • PySide 6:同时支持execexec_
  • PyQt 5:同时支持execexec_
  • PySide 2:仅支持exec_

还应该指出的是,这会影响除了QApplication之外的许多其他类-例如QMenuQDialogQThread等。
所以,向前看,不再需要使用exec_-除非你想支持PySide 2,或者下面提到的过时的Qt和Python版本。
(NB:标准Qt 5 LTS支持已于2023年5月终止,但commercial support has been extended to May 2025。然而,Qt 5的使用寿命很可能会超过这一点,因为KDE is still back-porting patches在最初的Qt开源许可证下)。

更新

由于PyQt 4/Qt 4和Python 2现在已经过时了,下面的部分答案不再相关:
关于是否更喜欢其中一个的问题:使用exec_意味着如果你决定添加对PyQt 4和/或Python >= 2.6的支持,并且想要维护一个单一的代码库,那么你就少了一件需要担心的事情。

pu3pd22g

pu3pd22g3#

从PyQt 6开始,不再支持app.exec_(),只支持app.exec()
因此,在构建新应用程序时,我只使用后者。
https://www.riverbankcomputing.com/static/Docs/PyQt6/pyqt5_differences.html?highlight=pyqt5

相关问题