Skip to main content

Support functions for working with PySide2/PySide6

Project description

qtility

Overview

PySide (a python wrapper around the Qt framework) is a brilliant libary which allows for the development of rich user interfaces.

However, there are a lot of common pieces of functionality that is needed reqularly which takes a fair amount of code to achieve. qtility exposes a series of functions which minimises code replication between qt projects.

Examples of these are being able to blinding resolve widgets from values and values from widgets (a mechanism which is great for building dynamic ui's to represent data). Other examples are fast paths to user interaction, emptying layouts and loading in ui files.

Installation

You can either clone or download this github repo, or alternatively you can install this via pip:

pip install qtility

Development Status

This is currently in development but is actively used. It will reach 1.x status within the next couple of months after further testing.

Getting Started Quick

Here is an example of a small application which makes use of the qtility library to remove some complexity from our code.

import qtility
from PySide6 import QtWidgets


# -- Memorable Window is a QMainWindow which stores its geometry data
# -- whenever its moved or resized and will re-open at the same location
# -- on screen
class Window(qtility.windows.MemorableWindow):

    def __init__(self, parent=None, ):
        super(Window, self).__init__(parent=parent, storage_identifier="foobar")
        self._widget = Widget(self)
        self.setCentralWidget(self._widget)


class Widget(QtWidgets.QWidget):

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

        # -- When adding a layout, quite often we want it with no
        # -- margins. The slimify function does that for us
        self.setLayout(
            qtility.layouts.slimify(
                QtWidgets.QVBoxLayout(),
            ),
        )

        self.some_arbitrary_values = {
            "An Int Value": int(1),
            "A Float Value": 12.0,
            "A String Value": "Hello",
            "A list of strings": ["A", "B", "C"],
            "A Checkbox": True,
        }
        self.dynamic_widgets = []

        for label, value in self.some_arbitrary_values.items():

            # -- Dynamically resolve the right widget based on the value
            widget = qtility.derive.qwidget(value)

            # -- Add a callback to trigger whenever that widget changes
            # -- without knowing what the widget is
            qtility.derive.connect(widget, self._react_to_change)

            self.layout().addWidget(widget)

        # -- Here we show how we can load a ui file as a child widget without
        # -- any overhead
        self.ui = qtility.designer.load(r"c:/path/to/ui_file.ui")
        self.layout().addWidget(self.ui)

    def _react_to_change(self, *args, **kwargs):
        print("Reacting to a widget change!")


if __name__ == "__main__":
    # -- Get the QApplication instance. This will create one for us
    # -- if there is not one available, but will return the running
    # -- instance if there is one. This is useful when working within
    # -- embedded environments.
    app = qtility.app.get()

    # -- Instance the window, but set the parent to the main window
    # -- of the running application. This is particularly useful if
    # -- running within embedded environments
    window = Window(parent=qtility.windows.application())
    window.show()

    app.exec_()

In this example we're using qtility which is a dynamic property which will automatically resolve based on whether PySide6 or PySide2 is available.

This ensures that qtility supports being used in qapplications which are designed to be used between different environments. However, if you explicitely want to use qtility for PySide2 or specifically for PySide6 then you can use the following code:

import qtility.six as qtility6

app = qtility6.app.get()
import qtility.two as qtuils2

app = qtuils2.app.get()

But generally it is better to allow qtility to resolve this for you using the example below as your code is then more likely to work between Qt versions.

import qtility

qtility.app.get()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qtility-1.0.3.tar.gz (25.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qtility-1.0.3-py3-none-any.whl (31.5 kB view details)

Uploaded Python 3

File details

Details for the file qtility-1.0.3.tar.gz.

File metadata

  • Download URL: qtility-1.0.3.tar.gz
  • Upload date:
  • Size: 25.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.7

File hashes

Hashes for qtility-1.0.3.tar.gz
Algorithm Hash digest
SHA256 9e28c39ed49f2045fe5dcd68a275417e794ab71f3ef5ee861cc32c6993daf57b
MD5 64ed59b9499b6cf04b3108d3c3b72bd0
BLAKE2b-256 263e2bd45d8cd480972e54a23bd184d0425e480c1b33565997b6a80470cbc762

See more details on using hashes here.

File details

Details for the file qtility-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: qtility-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 31.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.7

File hashes

Hashes for qtility-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 33e9d117f9d4960bbd37dee79ff326824f32a65205ea0f7ec0ee3166b3c6ad29
MD5 4f848537d3a331415cc8e12d805f4309
BLAKE2b-256 8fb88a7e56a9f6d0a87f7d9a3f7d395298865f60bd08afe4943790b6db898ef3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page