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

时间:2016-09-04 12:01:13

标签: python qt python-3.x pyqt5

对于我的应用程序,我需要设置一些小部件参数,如alignment(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

2 个答案:

答案 0 :(得分:6)

我认为这里的混乱是PyQt有一个名为public function team1() { return $this->belongsTo('\App\Match', 'team1_id'); } public function team2() { return $this->belongsTo('\App\Match', 'team2_id'); } 的特殊虚拟模块,它将所有导入一个命名空间。这是一个非常有用的功能,但遗憾的是,与Qt的名称冲突无法避免。

在第一个例子中,错误可以通过使用有些奇怪的QtCore.Qt来“修复”。但显然,明确从Qt.Qt.AlignBottom导入是一个更好的解决方案。值得注意的是QtCore包是一个惰性加载器,因此PyQt5只会导入一个空命名空间而无法访问其他模块。

答案 1 :(得分:3)

你可以这样做

>>> 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问题