Using PyQt in Qt Creator
PyQt and PySide are Python bindings for Qt. I will focus mainly on PyQt in this post, but most of what I write is also the case for PySide. Both are a common choices for adding a GUI to a Python application.
Using PyQt instead of the original C++ library makes it easy to deploy pure QML applications to a wider audience through Anaconda packages.
Because writing QML applications is best done in Qt Creator, this guide explains how to set up Qt Creator to work well with a PyQt project.
Installation and setup
Go ahead and download Qt or Qt Creator. Then, install Anaconda. On Linux, you currently need to install PyQt from pip, because the version provided by Anaconda doesn’t support OpenGL.
On other systems (or if you are reading this after the above issue has been fixed), Anaconda comes prepackaged with PyQt, so there is no need to install it with pip.
pip install pyqt5
Adding an Anaconda kit to Qt Creator
First, let us add a kit based on your PyQt installation. This is not strictly necessary, but ensures that the code completion will be based on your currently installed version of PyQt and not the version you installed from qt.io.
- Select Tools > Options > Build & Run > Qt Versions > Add.
- Find the path to your Anaconda installation and select
qmake
in thebin
directory of the installation - Click Apply.
- Select Kits in the same view and click Add.
- Rename the new kit to PyQt and change the Qt Version to the one you just added.
Adding a main file
Second, open your project or create a new one. Add a main.py file if you don’t have one from before. If you are running a default QML project, it should look something like this:
import sys
if sys.platform == "linux" or sys.platform == "linux2":
# TODO remove this OpenGL fix when PyQt
# doesn't require OpenGL to be loaded first.
# NOTE This must be placed before any other imports!
import ctypes
from ctypes.util import find_library
libGL = find_library("GL")
ctypes.CDLL(libGL, ctypes.RTLD_GLOBAL)
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtQml import *
from PyQt5.QtWidgets import *
import qml_qrc
def main():
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load(QUrl("qrc:/main.qml"))
return app.exec_()
if __name__ == "__main__":
sys.exit(main())
Note the fix that loads the GL library befre Qt on Linux systems. This is because of a bug that occurs with Nvidia drivers on Ubuntu.
Building resource files with pyrcc5
Third, change the build settings of your project (Ctrl+4). You need to add a build step that runs
<Anaconda install>/bin/pyrcc5 -o mypackage/qml_qrc.py mypackage/qml.qrc
If you have multiple .qrc files a build step needs to be added for each of those.
Running main.py
Finally, add a new Run configuration for your project.
This should run a custom executable, which is the python
executable found in
Anaconda’s bin directory.
The argument should be main.py
.
Change the run directory to %{sourceDir}/mypackage
.
With all this in place, you should be able to develop your PyQt project using Qt Creator.
Deploying to Anaconda Cloud
With your development environment set up, it is now possible to create a
conda package that can be uploaded to Anaconda cloud
.
Here is a simple meta.yaml
template that can be used to create a conda package:
package:
name: mypackage
version: 1.0
build:
entry_points:
- mypackage = mypackage.main:main
source:
path: .
requirements:
build:
- python
- setuptools
- pip
run:
- python
- setuptools
- pip
- pyqt >=5
test:
imports:
- mypackage
about:
home: https://github.com/CINPLA/exdir-browser/
license: GPLv3
license_file: LICENSE
Future improvements
This workflow could be improved by
- modifying the project’s .pro (or .qbs) file to run pyrcc5 automatically for each .qrc file.
- adding a plugin to Qt Creator that parses custom types registered by
qmlRegisterType
inmain.py
, similar to what is done in C++.
But even with these improvements missing, this setup makes it way easier to work with a QML/Python project in Qt Creator because of the added autocompletion.