For my application, I need to set some widget parameters like alignment (Qt::AlignBottom
) and others. But I can't import them (other PyQt5 stuff imports without any issues).
Using this code
from PyQt5 import Qt
progressBar = QProgressBar(splash)
progressBar.setAlignment(Qt.AlignBottom)
I got the following error:
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'
And using this one works:
from PyQt5.Qt import *
progressBar = QProgressBar(splash)
progressBar.setAlignment(Qt.AlignBottom)
Though I have a working solution, I would like to import only Qt.AlignBottom
and not *
. Also, why doesn't Qt.AlignBottom
work with from PyQt5 import Qt
?
I think the confusion here is that PyQt has a special virtual module called Qt
, which imports everything into a single namespace. This is a quite useful feature, but it's a real shame that the name clash with QtCore.Qt
wasn't avoided.
In the first example, the error can be "fixed" by using the somewhat weird-looking Qt.Qt.AlignBottom
. But obviously, explicitly importing from QtCore
is a much better solution. It's also worth noting that the PyQt5
package is a lazy loader, so import PyQt5
will just import an empty namespace with no access to the other modules.