- Qt 6.8
- Qt Widgets Designer Manual
- Using a Designer UI File in Your Qt for Python Application
- Qt 6.8.0 Reference Documentation

Using a Designer UI File in Your C++ Application ◦ Using Custom Widgets with Qt Widgets Designer

# Using a Designer UI File in Your Qt for Python Application

## Converting the Form to Python Code

To demonstrate, we use the Qt Widgets animation easing example.

The application consists of one source file, `easing.py`, a UI file `form.ui`, a resource file `easing.qrc` and the project file, `easing.pyproject` file in the YAML format:

     {
         "files": ["easing.qrc", "ui_form.py", "easing.py", "easing_rc.py",
                   "form.ui"]
     }

The UI file is converted to Python code building the form using the User Interface Compiler (uic):

     uic -g python form.ui > ui_form.py

Since the top level widget is named `Form`, this results in a Python class named `Ui_Form` being generated. It provides a function `setupUi()`, taking the widget as parameter, which is called to create the UI elements:

     from ui_form import Ui_Form
     ...
     class Window(QtWidgets.QWidget):
         def __init__(self, parent=None):
             super(Window, self).__init__(parent)

             self.m_ui = Ui_Form()
             self.m_ui.setupUi(self)

Later on, the widgets can be accessed via the `Ui_Form` class:

     self.m_ui.graphicsView.setScene(self.m_scene)

Besides `setupUi()`, `Ui_Form` provides another method `retranslateUi()`, which can be called in reaction to a QEvent of type QEvent.LanguageChange, which indicates a change in the application language.

### The UiTools Approach

The QUiLoader class provides a form loader object to construct the user interface at runtime. This user interface can be retrieved from any QIODevice, e.g., a QFile object. The QUiLoader::load() function constructs the form widget using the user interface description contained in the file.

It is demonstrated by the uiloader example:

     from PySide2.QtUiTools import QUiLoader

     if __name__ == '__main__':
         # Some code to obtain the form file name, ui_file_name
         app = QApplication(sys.argv)
         ui_file = QFile(ui_file_name)
         if not ui_file.open(QIODevice.ReadOnly):
             print("Cannot open {}: {}".format(ui_file_name, ui_file.errorString()))
             sys.exit(-1)
         loader = QUiLoader()
         widget = loader.load(ui_file, None)
         ui_file.close()
         if not widget:
             print(loader.errorString())
             sys.exit(-1)
         widget.show()
         sys.exit(app.exec_())

## Resource imports

### Single directory usage

When using icons from resource files, say `resources.qrc`, `uic` will generate an import of the form:

     import resources_rc

This assumes that a file `resources_rc.py` generated by calling the Resource Compiler (rcc) tool (passing the `-g python` command line option) exists in the same directory as the form source.

`uic` has a command line option `--rc-prefix` causing the `rc` indicator to be prepended:

     import rc_resources

The command line option `--from-imports` causes the imports to be generated relative to '.':

     from . import resources_rc

### Directory trees

Some projects have more complicated directory trees, for example:

     project
         resources   (resources.qrc)
         ui          (.ui files)

The resource file is then not in the same directory as the form source and the `.ui` files typically have relative paths to the resource files:

     <include location="../resources/resources.qrc"/>

In this case, the command line option `--absolute-imports` can be used to generate an absolute import in Python, resulting in:

     import resources.resources_rc

based on the assumption that `.`. is the root directory of the project contained in the Python import path list.

For more deeply nested trees, it is possible to use the command line option `--python-paths <path list>` to pass a Python import path list. `uic` will then try to determine the project root by matching the form file path against the path components.

If `--python-paths` is not given, the environment variable `PYTHONPATH` is by default checked.