Forms in OpenLP are made up of two classes. One class holds all the graphical elements, like buttons and lists, and the other class holds all the functional code, like slots and loading and saving.

The first class, commonly known as the Dialog class, is typically named Ui_<name>Dialog. It is a slightly modified version of the class that the pyuic5 command produces from Qt5’s .ui file. Typical modifications will be converting most strings from “” to ‘’ and using OpenLP’s translate() function for translating strings.

The second class, commonly known as the Form class, is typically named <name>Form. This class is the one which is instantiated and used. It uses dual inheritance to inherit from (usually) QtWidgets.QDialog and the Ui class mentioned above, like so:

class AuthorsForm(QtWidgets.QDialog, Ui_AuthorsDialog):

    def __init__(self, parent=None):
        super(AuthorsForm, self).__init__(parent)

This allows OpenLP to use self.object for all the GUI elements while keeping them separate from the functionality, so that it is easier to recreate the GUI from the .ui files later if necessary.