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 the bin 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 in main.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.