我应该在 PyQt 应用程序中使用 `app.exec()` 或 `app.exec_()` 吗?

问题描述 投票:0回答:3

我使用 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中的一个语言关键字。但是请在 Official PyQt5 Documentation (特别是 Object Destruction on Exit 部分) 上编写代码。我看到该示例显示了
app.exec()
的使用,这让我感到困惑。

当我在我的机器上测试它时。我发现与我的结局没有任何明显的区别。有和没有

_
都会在没有时间差的情况下产生相同的输出。

我的问题是:

  • 我使用
    app.exec()
    时有什么问题吗?就像与 Python 的内部
    exec
    发生冲突?我怀疑是因为两个
    exec
    都在执行某些操作。
  • 如果没有,我可以交替使用两者吗?
python qt python-3.x pyqt pyqt5
3个回答
115
投票

这是因为在 Python 3 之前,

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

已编辑

PyQt6 不再支持 exec_(),现在只有 exec() 可用

PyQt6 和 PyQt5 之间的区别

.... 所有 exec_() 和 print_() 方法已被删除。 ...


9
投票
为了完整起见,以下是当前情况(截至 2023 年 10 月):

    PyQt6:仅支持
  • exec
    
    
  • PySide6:同时支持
  • exec
    exec_
    
    
  • PyQt5:同时支持
  • exec
    exec_
    
    
  • PySide2:仅支持
  • exec_
    
    
还应该指出的是,这会影响除

QApplication

之外的许多其他类别 - 例如
QMenu
QDialog
QThread
等。

因此,展望未来,不再需要使用

exec_

 - 除非您想支持 PySide2,或下面提到的 Qt 和 Python 过时版本。

(注意:标准 Qt5 LTS 支持于 2023 年 5 月结束,尽管

商业支持已延长至 2025 年 5 月。但是,Qt5 的使用寿命可能会持续到此之后,因为 KDE 仍在向后移植补丁根据原始 Qt 开源许可证)。


更新

由于 PyQt4/Qt4 和 Python2 现已过时,以下部分答案不再相关:

关于是否更喜欢其中一个的问题:使用

exec_

意味着如果您决定添加,您就可以少担心一件事
支持 PyQt4 和/或 Python >= 2.6,并且想要维护单个
代码库。


2
投票
从 PyQt 6 开始,不再支持

app.exec_()

,仅支持 
app.exec()

因此,在构建新应用程序时,我只使用后者。

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

© www.soinside.com 2019 - 2024. All rights reserved.