如何从Qt :: namespase(Qt5,Python3.x)导入?

How to import from Qt:: namespase (Qt5, Python3.x)?

对于我的应用程序,我需要设置一些小部件参数,如对齐(Qt::AlignBottom和其他参数。但我不能进口它们(其他PYQT5员工进口时没有任何问题)。

使用此代码

1
2
3
4
from PyQt5 import Qt

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

我有以下错误:

1
2
3
4
5
6
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'

使用这一个可以:

1
2
3
4
from PyQt5.Qt import *

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

虽然我有工作解决方案,但我只想进口Qt.AlignBottom而不是*。为什么Qt.AlignBottom不与from PyQt5 import Qt一起工作?


我认为这里的混淆在于Pyqt有一个称为Qt的特殊虚拟模块,它将所有内容导入到一个名称空间中。这是一个非常有用的特性,但它的名字与QtCore.Qt的冲突并没有被避免是一个真正的遗憾。

在第一个示例中,可以使用外观有些奇怪的Qt.Qt.AlignBottom来"修复"错误。但显然,从QtCore明确进口是一个更好的解决方案。同样值得注意的是,PyQt5包是一个懒惰的加载程序,因此import PyQt5将只导入一个空的命名空间,而不访问其他模块。


你可以做到这一点

1
2
3
4
>>> from PyQt5.QtCore import Qt
>>> Qt.AlignBottom
64
>>>

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

所以这不管用

1
2
3
4
5
6
7
8
9
10
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所属的其他类和方法,您可以用看到。

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

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

我建议你阅读模块上的文档以及这个问题。