Package to construct PySide6 widgets from dataclass
Project description
Python package to dynamically create PySide6 widgets from dataclass
Introduction
dataclass2PySide6 is a package which provides widgets to represent dataclass
instance as PySide6
GUI.
For example, here is a simple dataclass:
from dataclasses import dataclass
from typing import Tuple
@dataclass
class DataClass:
a: int
b: Tuple[float, bool] = (4.2, True)
Dataclass widget can be dynamically created as follows.
from PySide6.QtWidgets import QApplication
import sys
from dataclass2PySide6 import DataclassWidget
app = QApplication(sys.argv)
widget = DataclassWidget.fromDataclass(DataClass)
widget.show()
app.exec()
app.quit()
Installation
Before you install, be careful for other Qt-dependent packages installed in your environment.
For example, non-headless OpenCV-Python
module modifies the Qt dependency thus making PySide6 unavailable.
dataclass2PySide6
can be installed using pip
.
$ pip install dataclass2PySide6
How to use
DataclassWidget
is a widget for single dataclass type.
For multiple dataclass types in one widget, StackedDataclassWidget
and TabDataclassWidget
are provided.
Single dataclass
DataclassWidget
is the core object of dataclass2PySide6
. It contains subwidgets which represent each fields of the dataclass.
User may subclass DataclassWidget
to define own datclass widget. Refer to the docstring for detailed description.
Creating widget
To construct DataclassWidget
, pass dataclass type object to DataclassWidget.fromDataclass()
method.
To construct suitable widget for each field, DataclassWidget
searches for Qt_typehint
metadata.
Its value must be the type annotation, not necessarily identical to type
attribute of the field.
See Dataclass example for the use case of Qt_typehint
.
If Qt_typehint
does not exist, it uses type
attribute of the field as a fallback.
Currently supported types are:
Enum
: converted to combo boxbool
: converted to check box (Union
withNone
allowed)int
andfloat
: converted to line edit with validator (Union
withNone
allowed)str
: converted to line editTuple
: converted to group box if element types are supported
Getting data value
When data from any subwidget changes, DataclassWidget.dataValueChanged
signal emits the new dataclass instance with current value.
For check box or combo box, this is when the current selection changes. For line edit, this is when editing is finished.
DataclassWidget.dataValue()
method returns the new dataclass instance with current data value.
Fields can define fromQt_converter
metadata to preprocess the data before dataclass construction.
Its value must be a unary function which converts the widget data to field value.
See Dataclass example for the use case of fromQt_converter
.
Setting data value
DataclassWidget.setDataValue()
method updates the subwidget data with new dataclass instance.
Fields can define toQt_converter
metadata to preprocess the data before dataclass construction.
Its value must be a unary function which converts the field value to widget data.
See Dataclass example for the use case of toQt_converter
.
Multiple dataclasses
StackedDataclassWidget
and TabDataclassWidget
provide multiple DataclassWidget
in one widget.
Both classes provide addDataclass()
method to add new widget for dataclass, and indexOf()
method to search widget for dataclass.
When current widget's value is changed, dataValuechanged
signal emits the new dataclass instance with current value.
Dataclass example
This is the example of dataclass which includes custom object.
Widget is constructed by Tuple[int, int]
to represent two parameters of MyObj
.
Conversion from tuple
to MyObj
and vice versa is defined.
from dataclasses import field
from typing import Tuple
class MyObj:
def __init__(self, x: int, y: int):
self.x = x
self.y = y
@dataclass
class DataClass:
my_obj: MyObj = field(
metadata=dict(
Qt_typehint=Tuple[int, int],
fromQt_converter=lambda tup: MyObj(*tup),
toQt_converter=lambda obj: (obj.x, obj.y)
)
)
Here is the constructed widget.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file dataclass2PySide6-1.7.1.tar.gz
.
File metadata
- Download URL: dataclass2PySide6-1.7.1.tar.gz
- Upload date:
- Size: 17.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f3b13026cd7c0d73207da6a5b214516cc83b6150edb68ec0f712cdcc48bcdf84 |
|
MD5 | 3042c2e8e3aed7210b641f63bc5cf61e |
|
BLAKE2b-256 | 0e3447da975e5464252222a5ef52163f938572a5791e7ef01a87b56190f34cee |
File details
Details for the file dataclass2PySide6-1.7.1-py3-none-any.whl
.
File metadata
- Download URL: dataclass2PySide6-1.7.1-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 17bf8da2b5bf992f4537e03292e8fe85258de955458bf2fc737bad467e2a091d |
|
MD5 | 6e0ce68ed1904190253d8b6b8d71b1f1 |
|
BLAKE2b-256 | cca432d133b721c4ef19b4b628f1b4632ad70c0ff6013d79a32ac396ef2ae3f7 |