如何从 Qt:: 命名空间(Qt5,Python3.x)导入?

Posted

技术标签:

【中文标题】如何从 Qt:: 命名空间(Qt5,Python3.x)导入?【英文标题】:How to import from Qt:: namespase (Qt5, Python3.x)? 【发布时间】:2017-01-12 00:05:42 【问题描述】:

对于我的应用程序,我需要设置一些小部件参数,例如对齐 (Qt::AlignBottom) 等。但我无法导入它们(其他 PyQt5 东西导入没有任何问题)。

使用此代码

from PyQt5 import Qt

progressBar = QProgressBar(splash)
progressBar.setAlignment(Qt.AlignBottom)

我收到以下错误:

Traceback (most recent call last):
  File "run_app.py", line 50, in <module>
    runSemApp(sys.argv)
  File "run_app.py", line 32, in runSemApp
    progressBar.setAlignment(Qt.AlignBottom)
AttributeError: 'module' object has no attribute 'AlignBottom'

并且使用这个有效:

from PyQt5.Qt import *

progressBar = QProgressBar(splash)
progressBar.setAlignment(Qt.AlignBottom)

虽然我有一个可行的解决方案,但我只想导入 Qt.AlignBottom 而不是 *。另外,为什么Qt.AlignBottom 不能与from PyQt5 import Qt 一起使用?

【问题讨论】:

【参考方案1】:

我认为这里的混淆在于 PyQt 有一个名为 Qt 的特殊虚拟模块,它将 everything 导入单个命名空间。这是一个非常有用的功能,但很遗憾没有避免名称与QtCore.Qt 发生冲突。

在第一个示例中,可以使用看起来有些奇怪的Qt.Qt.AlignBottom 来“修复”错误。但显然,从QtCore 显式导入是一个更好的解决方案。还值得注意的是,PyQt5 包是一个惰性加载器,所以import PyQt5 只会导入一个空的命名空间,而不能访问其他模块。

【讨论】:

【参考方案2】:

你可以这样做

>>> from PyQt5.QtCore import Qt
>>> Qt.AlignBottom
64
>>>

您不能仅导入AlignBottom,因为QtCore 本身不是一个包,它只是它自己的一个模块(单个文件)。重要的是要知道所有包都是模块,但并非所有模块都是包

所以这行不通

import PyQt5.QtCore.Qt

ImportError: No module named 'PyQt5.QtCore.Qt'; 'PyQt5.QtCore' is not a package
>>> import PyQt5.QtCore
>>> QtCore
<module 'PyQt5.QtCore' from '/usr/lib/python3.5/site-packages/PyQt5/QtCore.so'>
>>> import PyQt5
>>> PyQt5
<module 'PyQt5' from '/usr/lib/python3.5/site-packages/PyQt5/__init__.py'>
>>>

查看输出,您可以看到 QtCore 是一个包含类 Qt 的单个文件,其中包含 AlignBottom 所属的其他类和方法,您可以看到。

>>> from PyQt5.QtCore import Qt
>>> help(Qt)

另一方面,PyQt5 是一个包(包含其他模块的文件夹)指向它的 __init__.py

我建议你阅读关于模块的 docs 和这个 SO 问题

【讨论】:

我认为这里的混淆是 PyQt 有一个特殊的虚拟模块,称为 Qt,它将 everything 导入到单个命名空间中。这是一个非常有用的功能,但很遗憾没有避免名称与QtCore.Qt 发生冲突。在 OP 的第一个示例中,可以使用看起来有些奇怪的 Qt.Qt.AlignBottom 来“修复”错误。但显然,从QtCore 显式导入是一个更好的解决方案。还值得注意的是,PyQt5 包是一个惰性加载器,所以import PyQt5 只会导入一个空的命名空间,而不能访问其他模块。 @ekhumoro,如果您发表评论作为答案,我会接受。

以上是关于如何从 Qt:: 命名空间(Qt5,Python3.x)导入?的主要内容,如果未能解决你的问题,请参考以下文章

Python3 Qt5 主窗口

如何更改图像对比度(窗口中心和宽度)并在 QLabel 中显示(Python3.5,Qt5.1)

C++、命名空间、继承类和 Qt 上的名称查找

Python3.8+Qt5.0感知哈希算法实现图像检索系统

QT_STATIC_CONST 没有命名类型

Python3 + Pillow + QT5:当我调整包含图像的标签大小时崩溃