如何从 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)导入?的主要内容,如果未能解决你的问题,请参考以下文章