From 7594030e2e98ea9971f0cef5dff113f7921048fa Mon Sep 17 00:00:00 2001 From: Jisoo Song Date: Sun, 10 Sep 2023 14:05:04 +0900 Subject: [PATCH 1/3] doc: use sphinx-tabs --- doc/source/conf.py | 2 +- .../explanation/optional-vs-default.rst | 230 +++--- doc/source/user-guide/highlight-widget.rst | 168 ++--- doc/source/user-guide/model.rst | 242 +++--- doc/source/user-guide/multi-dcls.rst | 696 +++++++++--------- doc/source/user-guide/widget.rst | 102 +-- pyproject.toml | 4 +- 7 files changed, 722 insertions(+), 722 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index b502ab7..d4192a8 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -32,7 +32,7 @@ "sphinx.ext.autodoc", "sphinx.ext.intersphinx", "sphinx.ext.viewcode", - "sphinx_code_tabs", + "sphinx_tabs.tabs", "numpydoc", ] diff --git a/doc/source/explanation/optional-vs-default.rst b/doc/source/explanation/optional-vs-default.rst index c28c23e..daccdb2 100644 --- a/doc/source/explanation/optional-vs-default.rst +++ b/doc/source/explanation/optional-vs-default.rst @@ -62,121 +62,121 @@ How will the data widget from ``DataClass`` be? .. tabs:: - .. code-tab:: python - :caption: PySide6 - - from PySide6.QtGui import QStandardItemModel, QStandardItem - from PySide6.QtWidgets import QApplication - from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget - import sys - - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) - - delegate = DataclassDelegate() - mapper = DataclassMapper() - mapper.setItemDelegate(delegate) - mapper.setModel(model) - - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) - - widget.show() - app.exec() - app.quit() - - .. code-tab:: python - :caption: PyQt6 - - from PyQt6.QtGui import QStandardItemModel, QStandardItem - from PyQt6.QtWidgets import QApplication - from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget - import sys - - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) - - delegate = DataclassDelegate() - mapper = DataclassMapper() - mapper.setItemDelegate(delegate) - mapper.setModel(model) - - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) - - widget.show() - app.exec() - app.quit() - - .. code-tab:: python - :caption: PySide2 - - from PySide2.QtGui import QStandardItemModel, QStandardItem - from PySide2.QtWidgets import QApplication - from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget - import sys - - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) - - delegate = DataclassDelegate() - mapper = DataclassMapper() - mapper.setItemDelegate(delegate) - mapper.setModel(model) - - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) - - widget.show() - app.exec_() - app.quit() - - .. code-tab:: python - :caption: PyQt5 - - from PyQt5.QtGui import QStandardItemModel, QStandardItem - from PyQt5.QtWidgets import QApplication - from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget - import sys - - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) - - delegate = DataclassDelegate() - mapper = DataclassMapper() - mapper.setItemDelegate(delegate) - mapper.setModel(model) - - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) - - widget.show() - app.exec() - app.quit() + .. tab:: PySide6 + + .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem + from PySide6.QtWidgets import QApplication + from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget + import sys + + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) + + delegate = DataclassDelegate() + mapper = DataclassMapper() + mapper.setItemDelegate(delegate) + mapper.setModel(model) + + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) + + widget.show() + app.exec() + app.quit() + + .. tab:: PyQt6 + + .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem + from PyQt6.QtWidgets import QApplication + from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget + import sys + + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) + + delegate = DataclassDelegate() + mapper = DataclassMapper() + mapper.setItemDelegate(delegate) + mapper.setModel(model) + + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) + + widget.show() + app.exec() + app.quit() + + .. tab:: PySide2 + + .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem + from PySide2.QtWidgets import QApplication + from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget + import sys + + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) + + delegate = DataclassDelegate() + mapper = DataclassMapper() + mapper.setItemDelegate(delegate) + mapper.setModel(model) + + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) + + widget.show() + app.exec_() + app.quit() + + .. tab:: PyQt5 + + .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem + from PyQt5.QtWidgets import QApplication + from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget + import sys + + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) + + delegate = DataclassDelegate() + mapper = DataclassMapper() + mapper.setItemDelegate(delegate) + mapper.setModel(model) + + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) + + widget.show() + app.exec() + app.quit() .. figure:: ../_images/optionalfield-example.jpg diff --git a/doc/source/user-guide/highlight-widget.rst b/doc/source/user-guide/highlight-widget.rst index 30409f7..1a62a62 100644 --- a/doc/source/user-guide/highlight-widget.rst +++ b/doc/source/user-guide/highlight-widget.rst @@ -28,49 +28,49 @@ We construct a simple model with one item. .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - from PySide6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - from PyQt6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - from PySide2.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - from PyQt5.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) Now we construct the delegate and the mapper. @@ -88,77 +88,77 @@ Before running the application, we set the style sheet to :class:`QApplication`. .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - from PySide6.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + .. code-block:: python + from PySide6.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec() - app.quit() + widget.show() + app.exec() + app.quit() - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - from PyQt6.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + .. code-block:: python + from PyQt6.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec() - app.quit() + widget.show() + app.exec() + app.quit() - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - from PySide2.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + .. code-block:: python + from PySide2.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec_() - app.quit() + widget.show() + app.exec_() + app.quit() - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - from PyQt5.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + .. code-block:: python + from PyQt5.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec() - app.quit() + widget.show() + app.exec() + app.quit() Below is the image of the resulting widget. Required fields are marked with red boundaries, which are gone when we fill the value. diff --git a/doc/source/user-guide/model.rst b/doc/source/user-guide/model.rst index f00edaf..4b35ed8 100644 --- a/doc/source/user-guide/model.rst +++ b/doc/source/user-guide/model.rst @@ -41,53 +41,53 @@ Then we construct a model with two items, each storing the dataclass type which .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - from PySide6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for _ in range(2): - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for _ in range(2): + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - from PyQt6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for _ in range(2): - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for _ in range(2): + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - from PySide2.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for _ in range(2): - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for _ in range(2): + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - from PyQt5.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for _ in range(2): - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for _ in range(2): + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) Now we construct the delegate and the mapper. @@ -108,117 +108,117 @@ The widget consists of: .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from dawiq import dataclass2Widget - import sys + .. code-block:: python + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - widget = QWidget() - widget.setLayout(QVBoxLayout()) - dataWidget = dataclass2Widget(DataClass) - widget.layout().addWidget(dataWidget) - btn1 = QPushButton("Previous") - widget.layout().addWidget(btn1) - btn2 = QPushButton("Next") - widget.layout().addWidget(btn2) + widget = QWidget() + widget.setLayout(QVBoxLayout()) + dataWidget = dataclass2Widget(DataClass) + widget.layout().addWidget(dataWidget) + btn1 = QPushButton("Previous") + widget.layout().addWidget(btn1) + btn2 = QPushButton("Next") + widget.layout().addWidget(btn2) - btn1.clicked.connect(mapper.toPrevious) - btn2.clicked.connect(mapper.toNext) + btn1.clicked.connect(mapper.toPrevious) + btn2.clicked.connect(mapper.toNext) - mapper.addMapping(dataWidget, 0) - mapper.setCurrentIndex(0) + mapper.addMapping(dataWidget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec() - app.quit() + widget.show() + app.exec() + app.quit() - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from dawiq import dataclass2Widget - import sys + .. code-block:: python + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - widget = QWidget() - widget.setLayout(QVBoxLayout()) - dataWidget = dataclass2Widget(DataClass) - widget.layout().addWidget(dataWidget) - btn1 = QPushButton("Previous") - widget.layout().addWidget(btn1) - btn2 = QPushButton("Next") - widget.layout().addWidget(btn2) + widget = QWidget() + widget.setLayout(QVBoxLayout()) + dataWidget = dataclass2Widget(DataClass) + widget.layout().addWidget(dataWidget) + btn1 = QPushButton("Previous") + widget.layout().addWidget(btn1) + btn2 = QPushButton("Next") + widget.layout().addWidget(btn2) - btn1.clicked.connect(mapper.toPrevious) - btn2.clicked.connect(mapper.toNext) + btn1.clicked.connect(mapper.toPrevious) + btn2.clicked.connect(mapper.toNext) - mapper.addMapping(dataWidget, 0) - mapper.setCurrentIndex(0) + mapper.addMapping(dataWidget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec() - app.quit() + widget.show() + app.exec() + app.quit() - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from dawiq import dataclass2Widget - import sys + .. code-block:: python + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - widget = QWidget() - widget.setLayout(QVBoxLayout()) - dataWidget = dataclass2Widget(DataClass) - widget.layout().addWidget(dataWidget) - btn1 = QPushButton("Previous") - widget.layout().addWidget(btn1) - btn2 = QPushButton("Next") - widget.layout().addWidget(btn2) + widget = QWidget() + widget.setLayout(QVBoxLayout()) + dataWidget = dataclass2Widget(DataClass) + widget.layout().addWidget(dataWidget) + btn1 = QPushButton("Previous") + widget.layout().addWidget(btn1) + btn2 = QPushButton("Next") + widget.layout().addWidget(btn2) - btn1.clicked.connect(mapper.toPrevious) - btn2.clicked.connect(mapper.toNext) + btn1.clicked.connect(mapper.toPrevious) + btn2.clicked.connect(mapper.toNext) - mapper.addMapping(dataWidget, 0) - mapper.setCurrentIndex(0) + mapper.addMapping(dataWidget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec_() - app.quit() + widget.show() + app.exec_() + app.quit() - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from dawiq import dataclass2Widget - import sys + .. code-block:: python + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - widget = QWidget() - widget.setLayout(QVBoxLayout()) - dataWidget = dataclass2Widget(DataClass) - widget.layout().addWidget(dataWidget) - btn1 = QPushButton("Previous") - widget.layout().addWidget(btn1) - btn2 = QPushButton("Next") - widget.layout().addWidget(btn2) + widget = QWidget() + widget.setLayout(QVBoxLayout()) + dataWidget = dataclass2Widget(DataClass) + widget.layout().addWidget(dataWidget) + btn1 = QPushButton("Previous") + widget.layout().addWidget(btn1) + btn2 = QPushButton("Next") + widget.layout().addWidget(btn2) - btn1.clicked.connect(mapper.toPrevious) - btn2.clicked.connect(mapper.toNext) + btn1.clicked.connect(mapper.toPrevious) + btn2.clicked.connect(mapper.toNext) - mapper.addMapping(dataWidget, 0) - mapper.setCurrentIndex(0) - - widget.show() - app.exec() - app.quit() + mapper.addMapping(dataWidget, 0) + mapper.setCurrentIndex(0) + + widget.show() + app.exec() + app.quit() Below is the image of the resulting widget. Try change the model index and the editor data, and see if the data is stored and read correctly. diff --git a/doc/source/user-guide/multi-dcls.rst b/doc/source/user-guide/multi-dcls.rst index 0c5deb2..f7309a7 100644 --- a/doc/source/user-guide/multi-dcls.rst +++ b/doc/source/user-guide/multi-dcls.rst @@ -45,214 +45,214 @@ Then we construct the widget with basic API, and add the dataclass types. .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from PySide6.QtCore import Signal - from dawiq import DataclassTabWidget, dataclass2Widget - import sys + .. code-block:: python + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from PySide6.QtCore import Signal + from dawiq import DataclassTabWidget, dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - class MyWidget(QWidget): + class MyWidget(QWidget): - toPrevious = Signal() - toNext = Signal() + toPrevious = Signal() + toNext = Signal() - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, parent=None): + super().__init__(parent) - self.setLayout(QVBoxLayout()) + self.setLayout(QVBoxLayout()) - self.tabWidget = DataclassTabWidget() - self.layout().addWidget(self.tabWidget) + self.tabWidget = DataclassTabWidget() + self.layout().addWidget(self.tabWidget) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - def addDataclass(self, dcls): - self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) + def addDataclass(self, dcls): + self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - myWidget = MyWidget() + myWidget = MyWidget() - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from PyQt6.QtCore import pyqtSignal - from dawiq import DataclassTabWidget, dataclass2Widget - import sys + .. code-block:: python + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from PyQt6.QtCore import pyqtSignal + from dawiq import DataclassTabWidget, dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - class MyWidget(QWidget): + class MyWidget(QWidget): - toPrevious = pyqtSignal() - toNext = pyqtSignal() + toPrevious = pyqtSignal() + toNext = pyqtSignal() - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, parent=None): + super().__init__(parent) - self.setLayout(QVBoxLayout()) + self.setLayout(QVBoxLayout()) - self.tabWidget = DataclassTabWidget() - self.layout().addWidget(self.tabWidget) + self.tabWidget = DataclassTabWidget() + self.layout().addWidget(self.tabWidget) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - def addDataclass(self, dcls): - self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) + def addDataclass(self, dcls): + self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - myWidget = MyWidget() + myWidget = MyWidget() - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from PySide2.QtCore import Signal - from dawiq import DataclassTabWidget, dataclass2Widget - import sys + .. code-block:: python + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from PySide2.QtCore import Signal + from dawiq import DataclassTabWidget, dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - class MyWidget(QWidget): + class MyWidget(QWidget): - toPrevious = Signal() - toNext = Signal() + toPrevious = Signal() + toNext = Signal() - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, parent=None): + super().__init__(parent) - self.setLayout(QVBoxLayout()) + self.setLayout(QVBoxLayout()) - self.tabWidget = DataclassTabWidget() - self.layout().addWidget(self.tabWidget) + self.tabWidget = DataclassTabWidget() + self.layout().addWidget(self.tabWidget) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - def addDataclass(self, dcls): - self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) + def addDataclass(self, dcls): + self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - myWidget = MyWidget() + myWidget = MyWidget() - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from PyQt5.QtCore import pyqtSignal - from dawiq import DataclassTabWidget, dataclass2Widget - import sys + .. code-block:: python + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from PyQt5.QtCore import pyqtSignal + from dawiq import DataclassTabWidget, dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - class MyWidget(QWidget): + class MyWidget(QWidget): - toPrevious = pyqtSignal() - toNext = pyqtSignal() + toPrevious = pyqtSignal() + toNext = pyqtSignal() - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, parent=None): + super().__init__(parent) - self.setLayout(QVBoxLayout()) + self.setLayout(QVBoxLayout()) - self.tabWidget = DataclassTabWidget() - self.layout().addWidget(self.tabWidget) + self.tabWidget = DataclassTabWidget() + self.layout().addWidget(self.tabWidget) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - def addDataclass(self, dcls): - self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) + def addDataclass(self, dcls): + self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - myWidget = MyWidget() + myWidget = MyWidget() - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) Now we construct a model with two items, each having different data types. .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - from PySide6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - from PyQt6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - from PySide2.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - from PyQt5.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=DataclassDelegate.TypeRole) + model.appendRow(item) Finally we construct the delegate and the mapper, and set up the system. @@ -274,45 +274,45 @@ Now let's set the data and display the widget. .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec() - app.quit() + myWidget.show() + app.exec() + app.quit() - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec() - app.quit() + myWidget.show() + app.exec() + app.quit() - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec_() - app.quit() + myWidget.show() + app.exec_() + app.quit() - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec() - app.quit() + myWidget.show() + app.exec() + app.quit() .. figure:: ../_images/dcls-tab-example.jpg :align: center @@ -335,181 +335,181 @@ Dataclasses are same to :ref:`multi-dcls-basic`, so we go directly to widget con .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton - from PySide6.QtCore import Signal - from dawiq import DataclassStackedWidget, dataclass2Widget - import sys + .. code-block:: python + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton + from PySide6.QtCore import Signal + from dawiq import DataclassStackedWidget, dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - class MyWidget(QWidget): + class MyWidget(QWidget): - toPrevious = Signal() - toNext = Signal() + toPrevious = Signal() + toNext = Signal() - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, parent=None): + super().__init__(parent) - self.setLayout(QVBoxLayout()) + self.setLayout(QVBoxLayout()) - self.comboBox = QComboBox() - self.comboBox.setPlaceholderText("Select dataclass type") - self.layout().addWidget(self.comboBox) + self.comboBox = QComboBox() + self.comboBox.setPlaceholderText("Select dataclass type") + self.layout().addWidget(self.comboBox) - self.stackedWidget = DataclassStackedWidget() - self.layout().addWidget(self.stackedWidget) + self.stackedWidget = DataclassStackedWidget() + self.layout().addWidget(self.stackedWidget) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - def addDataclass(self, dcls): - self.comboBox.addItem(dcls.__name__, dcls) - self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) + def addDataclass(self, dcls): + self.comboBox.addItem(dcls.__name__, dcls) + self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - myWidget = MyWidget() + myWidget = MyWidget() - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton - from PyQt6.QtCore import pyqtSignal - from dawiq import DataclassStackedWidget, dataclass2Widget - import sys + .. code-block:: python + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton + from PyQt6.QtCore import pyqtSignal + from dawiq import DataclassStackedWidget, dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - class MyWidget(QWidget): + class MyWidget(QWidget): - toPrevious = pyqtSignal() - toNext = pyqtSignal() + toPrevious = pyqtSignal() + toNext = pyqtSignal() - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, parent=None): + super().__init__(parent) - self.setLayout(QVBoxLayout()) + self.setLayout(QVBoxLayout()) - self.comboBox = QComboBox() - self.comboBox.setPlaceholderText("Select dataclass type") - self.layout().addWidget(self.comboBox) + self.comboBox = QComboBox() + self.comboBox.setPlaceholderText("Select dataclass type") + self.layout().addWidget(self.comboBox) - self.stackedWidget = DataclassStackedWidget() - self.layout().addWidget(self.stackedWidget) + self.stackedWidget = DataclassStackedWidget() + self.layout().addWidget(self.stackedWidget) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - def addDataclass(self, dcls): - self.comboBox.addItem(dcls.__name__, dcls) - self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) + def addDataclass(self, dcls): + self.comboBox.addItem(dcls.__name__, dcls) + self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - myWidget = MyWidget() + myWidget = MyWidget() - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton - from PySide2.QtCore import Signal - from dawiq import DataclassStackedWidget, dataclass2Widget - import sys + .. code-block:: python + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton + from PySide2.QtCore import Signal + from dawiq import DataclassStackedWidget, dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - class MyWidget(QWidget): + class MyWidget(QWidget): - toPrevious = Signal() - toNext = Signal() + toPrevious = Signal() + toNext = Signal() - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, parent=None): + super().__init__(parent) - self.setLayout(QVBoxLayout()) + self.setLayout(QVBoxLayout()) - self.comboBox = QComboBox() - self.comboBox.setPlaceholderText("Select dataclass type") - self.layout().addWidget(self.comboBox) + self.comboBox = QComboBox() + self.comboBox.setPlaceholderText("Select dataclass type") + self.layout().addWidget(self.comboBox) - self.stackedWidget = DataclassStackedWidget() - self.layout().addWidget(self.stackedWidget) + self.stackedWidget = DataclassStackedWidget() + self.layout().addWidget(self.stackedWidget) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - def addDataclass(self, dcls): - self.comboBox.addItem(dcls.__name__, dcls) - self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) + def addDataclass(self, dcls): + self.comboBox.addItem(dcls.__name__, dcls) + self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - myWidget = MyWidget() + myWidget = MyWidget() - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton - from PyQt5.QtCore import pyqtSignal - from dawiq import DataclassStackedWidget, dataclass2Widget - import sys + .. code-block:: python + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton + from PyQt5.QtCore import pyqtSignal + from dawiq import DataclassStackedWidget, dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - class MyWidget(QWidget): + class MyWidget(QWidget): - toPrevious = pyqtSignal() - toNext = pyqtSignal() + toPrevious = pyqtSignal() + toNext = pyqtSignal() - def __init__(self, parent=None): - super().__init__(parent) + def __init__(self, parent=None): + super().__init__(parent) - self.setLayout(QVBoxLayout()) + self.setLayout(QVBoxLayout()) - self.comboBox = QComboBox() - self.comboBox.setPlaceholderText("Select dataclass type") - self.layout().addWidget(self.comboBox) + self.comboBox = QComboBox() + self.comboBox.setPlaceholderText("Select dataclass type") + self.layout().addWidget(self.comboBox) - self.stackedWidget = DataclassStackedWidget() - self.layout().addWidget(self.stackedWidget) + self.stackedWidget = DataclassStackedWidget() + self.layout().addWidget(self.stackedWidget) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - def addDataclass(self, dcls): - self.comboBox.addItem(dcls.__name__, dcls) - self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) + def addDataclass(self, dcls): + self.comboBox.addItem(dcls.__name__, dcls) + self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - myWidget = MyWidget() + myWidget = MyWidget() - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) We need to define a delegate so that it can synchronize ``DataclassStackedWidget`` and ``QComboBox``. @@ -539,49 +539,49 @@ Now we construct a model with two items, each having different data types. .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - from PySide6.QtGui import QStandardItemModel, QStandardItem + .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=delegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=delegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - from PyQt6.QtGui import QStandardItemModel, QStandardItem + .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=delegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=delegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - from PySide2.QtGui import QStandardItemModel, QStandardItem + .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=delegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=delegate.TypeRole) + model.appendRow(item) - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - from PyQt5.QtGui import QStandardItemModel, QStandardItem + .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=delegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=delegate.TypeRole) + model.appendRow(item) We also need to define a mapper so that whenever the combo box index changes the model will get updated too. @@ -614,45 +614,45 @@ Now let's set the data and display the widget. .. tabs:: - .. code-tab:: python - :caption: PySide6 + .. tab:: PySide6 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec() - app.quit() + myWidget.show() + app.exec() + app.quit() - .. code-tab:: python - :caption: PyQt6 + .. tab:: PyQt6 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec() - app.quit() + myWidget.show() + app.exec() + app.quit() - .. code-tab:: python - :caption: PySide2 + .. tab:: PySide2 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec_() - app.quit() + myWidget.show() + app.exec_() + app.quit() - .. code-tab:: python - :caption: PyQt5 + .. tab:: PyQt5 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec() - app.quit() + myWidget.show() + app.exec() + app.quit() .. figure:: ../_images/dcls-custom-example.jpg :align: center diff --git a/doc/source/user-guide/widget.rst b/doc/source/user-guide/widget.rst index d246838..4d2552f 100644 --- a/doc/source/user-guide/widget.rst +++ b/doc/source/user-guide/widget.rst @@ -30,57 +30,57 @@ We then create a widget and display it. .. tabs:: - .. code-tab:: python - :caption: PySide6 - - from PySide6.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys - - app = QApplication(sys.argv) - dataWidget = dataclass2Widget(DataClass) - dataWidget.show() - app.exec() - app.quit() - - .. code-tab:: python - :caption: PyQt6 - - from PyQt6.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys - - app = QApplication(sys.argv) - dataWidget = dataclass2Widget(DataClass) - dataWidget.show() - app.exec() - app.quit() - - .. code-tab:: python - :caption: PySide2 - - from PySide2.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys - - app = QApplication(sys.argv) - dataWidget = dataclass2Widget(DataClass) - dataWidget.show() - app.exec_() - app.quit() - - .. code-tab:: python - :caption: PyQt5 - - from PyQt5.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys - - app = QApplication(sys.argv) - dataWidget = dataclass2Widget(DataClass) - dataWidget.show() - app.exec() - app.quit() + .. tab:: PySide6 + + .. code-block:: python + from PySide6.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys + + app = QApplication(sys.argv) + dataWidget = dataclass2Widget(DataClass) + dataWidget.show() + app.exec() + app.quit() + + .. tab:: PyQt6 + + .. code-block:: python + from PyQt6.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys + + app = QApplication(sys.argv) + dataWidget = dataclass2Widget(DataClass) + dataWidget.show() + app.exec() + app.quit() + + .. tab:: PySide2 + + .. code-block:: python + from PySide2.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys + + app = QApplication(sys.argv) + dataWidget = dataclass2Widget(DataClass) + dataWidget.show() + app.exec_() + app.quit() + + .. tab:: PyQt5 + + .. code-block:: python + from PyQt5.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys + + app = QApplication(sys.argv) + dataWidget = dataclass2Widget(DataClass) + dataWidget.show() + app.exec() + app.quit() Your widget will look like this: diff --git a/pyproject.toml b/pyproject.toml index 973176d..8ec0132 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,8 +48,8 @@ test-ci = [ ] doc = [ "numpydoc", - "sphinx < 5.2", - "sphinx_code_tabs", + "sphinx", + "sphinx-tabs", "sphinx_rtd_theme", ] full = ["dawiq[test,doc]"] From 9b2ecedb763c0ff11b70a7f261eaeed49732b3e9 Mon Sep 17 00:00:00 2001 From: Jisoo Song Date: Sun, 10 Sep 2023 14:11:20 +0900 Subject: [PATCH 2/3] doc: use sphinx-tabs Fix code blocks --- .../explanation/optional-vs-default.rst | 4 ++++ doc/source/user-guide/highlight-widget.rst | 8 +++++++ doc/source/user-guide/model.rst | 8 +++++++ doc/source/user-guide/multi-dcls.rst | 24 +++++++++++++++++++ doc/source/user-guide/widget.rst | 4 ++++ 5 files changed, 48 insertions(+) diff --git a/doc/source/explanation/optional-vs-default.rst b/doc/source/explanation/optional-vs-default.rst index daccdb2..65922e3 100644 --- a/doc/source/explanation/optional-vs-default.rst +++ b/doc/source/explanation/optional-vs-default.rst @@ -65,6 +65,7 @@ How will the data widget from ``DataClass`` be? .. tab:: PySide6 .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem from PySide6.QtWidgets import QApplication from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget @@ -94,6 +95,7 @@ How will the data widget from ``DataClass`` be? .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem from PyQt6.QtWidgets import QApplication from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget @@ -123,6 +125,7 @@ How will the data widget from ``DataClass`` be? .. tab:: PySide2 .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem from PySide2.QtWidgets import QApplication from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget @@ -152,6 +155,7 @@ How will the data widget from ``DataClass`` be? .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem from PyQt5.QtWidgets import QApplication from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget diff --git a/doc/source/user-guide/highlight-widget.rst b/doc/source/user-guide/highlight-widget.rst index 1a62a62..0bd693d 100644 --- a/doc/source/user-guide/highlight-widget.rst +++ b/doc/source/user-guide/highlight-widget.rst @@ -31,6 +31,7 @@ We construct a simple model with one item. .. tab:: PySide6 .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -42,6 +43,7 @@ We construct a simple model with one item. .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -53,6 +55,7 @@ We construct a simple model with one item. .. tab:: PySide2 .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -64,6 +67,7 @@ We construct a simple model with one item. .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -91,6 +95,7 @@ Before running the application, we set the style sheet to :class:`QApplication`. .. tab:: PySide6 .. code-block:: python + from PySide6.QtWidgets import QApplication from dawiq import dataclass2Widget import sys @@ -109,6 +114,7 @@ Before running the application, we set the style sheet to :class:`QApplication`. .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtWidgets import QApplication from dawiq import dataclass2Widget import sys @@ -127,6 +133,7 @@ Before running the application, we set the style sheet to :class:`QApplication`. .. tab:: PySide2 .. code-block:: python + from PySide2.QtWidgets import QApplication from dawiq import dataclass2Widget import sys @@ -145,6 +152,7 @@ Before running the application, we set the style sheet to :class:`QApplication`. .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtWidgets import QApplication from dawiq import dataclass2Widget import sys diff --git a/doc/source/user-guide/model.rst b/doc/source/user-guide/model.rst index 4b35ed8..c8ae377 100644 --- a/doc/source/user-guide/model.rst +++ b/doc/source/user-guide/model.rst @@ -44,6 +44,7 @@ Then we construct a model with two items, each storing the dataclass type which .. tab:: PySide6 .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -56,6 +57,7 @@ Then we construct a model with two items, each storing the dataclass type which .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -68,6 +70,7 @@ Then we construct a model with two items, each storing the dataclass type which .. tab:: PySide2 .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -80,6 +83,7 @@ Then we construct a model with two items, each storing the dataclass type which .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -111,6 +115,7 @@ The widget consists of: .. tab:: PySide6 .. code-block:: python + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from dawiq import dataclass2Widget import sys @@ -139,6 +144,7 @@ The widget consists of: .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from dawiq import dataclass2Widget import sys @@ -167,6 +173,7 @@ The widget consists of: .. tab:: PySide2 .. code-block:: python + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from dawiq import dataclass2Widget import sys @@ -195,6 +202,7 @@ The widget consists of: .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from dawiq import dataclass2Widget import sys diff --git a/doc/source/user-guide/multi-dcls.rst b/doc/source/user-guide/multi-dcls.rst index f7309a7..248f7fa 100644 --- a/doc/source/user-guide/multi-dcls.rst +++ b/doc/source/user-guide/multi-dcls.rst @@ -48,6 +48,7 @@ Then we construct the widget with basic API, and add the dataclass types. .. tab:: PySide6 .. code-block:: python + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from PySide6.QtCore import Signal from dawiq import DataclassTabWidget, dataclass2Widget @@ -87,6 +88,7 @@ Then we construct the widget with basic API, and add the dataclass types. .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from PyQt6.QtCore import pyqtSignal from dawiq import DataclassTabWidget, dataclass2Widget @@ -126,6 +128,7 @@ Then we construct the widget with basic API, and add the dataclass types. .. tab:: PySide2 .. code-block:: python + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from PySide2.QtCore import Signal from dawiq import DataclassTabWidget, dataclass2Widget @@ -165,6 +168,7 @@ Then we construct the widget with basic API, and add the dataclass types. .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton from PyQt5.QtCore import pyqtSignal from dawiq import DataclassTabWidget, dataclass2Widget @@ -209,6 +213,7 @@ Now we construct a model with two items, each having different data types. .. tab:: PySide6 .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -221,6 +226,7 @@ Now we construct a model with two items, each having different data types. .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -233,6 +239,7 @@ Now we construct a model with two items, each having different data types. .. tab:: PySide2 .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -245,6 +252,7 @@ Now we construct a model with two items, each having different data types. .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem from dawiq import DataclassDelegate @@ -277,6 +285,7 @@ Now let's set the data and display the widget. .. tab:: PySide6 .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) @@ -287,6 +296,7 @@ Now let's set the data and display the widget. .. tab:: PyQt6 .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) @@ -297,6 +307,7 @@ Now let's set the data and display the widget. .. tab:: PySide2 .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) @@ -307,6 +318,7 @@ Now let's set the data and display the widget. .. tab:: PyQt5 .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) @@ -338,6 +350,7 @@ Dataclasses are same to :ref:`multi-dcls-basic`, so we go directly to widget con .. tab:: PySide6 .. code-block:: python + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton from PySide6.QtCore import Signal from dawiq import DataclassStackedWidget, dataclass2Widget @@ -382,6 +395,7 @@ Dataclasses are same to :ref:`multi-dcls-basic`, so we go directly to widget con .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton from PyQt6.QtCore import pyqtSignal from dawiq import DataclassStackedWidget, dataclass2Widget @@ -426,6 +440,7 @@ Dataclasses are same to :ref:`multi-dcls-basic`, so we go directly to widget con .. tab:: PySide2 .. code-block:: python + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton from PySide2.QtCore import Signal from dawiq import DataclassStackedWidget, dataclass2Widget @@ -470,6 +485,7 @@ Dataclasses are same to :ref:`multi-dcls-basic`, so we go directly to widget con .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton from PyQt5.QtCore import pyqtSignal from dawiq import DataclassStackedWidget, dataclass2Widget @@ -542,6 +558,7 @@ Now we construct a model with two items, each having different data types. .. tab:: PySide6 .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem model = QStandardItemModel() @@ -553,6 +570,7 @@ Now we construct a model with two items, each having different data types. .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtGui import QStandardItemModel, QStandardItem model = QStandardItemModel() @@ -564,6 +582,7 @@ Now we construct a model with two items, each having different data types. .. tab:: PySide2 .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem model = QStandardItemModel() @@ -575,6 +594,7 @@ Now we construct a model with two items, each having different data types. .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtGui import QStandardItemModel, QStandardItem model = QStandardItemModel() @@ -617,6 +637,7 @@ Now let's set the data and display the widget. .. tab:: PySide6 .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) @@ -627,6 +648,7 @@ Now let's set the data and display the widget. .. tab:: PyQt6 .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) @@ -637,6 +659,7 @@ Now let's set the data and display the widget. .. tab:: PySide2 .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) @@ -647,6 +670,7 @@ Now let's set the data and display the widget. .. tab:: PyQt5 .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) diff --git a/doc/source/user-guide/widget.rst b/doc/source/user-guide/widget.rst index 4d2552f..8984bd7 100644 --- a/doc/source/user-guide/widget.rst +++ b/doc/source/user-guide/widget.rst @@ -33,6 +33,7 @@ We then create a widget and display it. .. tab:: PySide6 .. code-block:: python + from PySide6.QtWidgets import QApplication from dawiq import dataclass2Widget import sys @@ -46,6 +47,7 @@ We then create a widget and display it. .. tab:: PyQt6 .. code-block:: python + from PyQt6.QtWidgets import QApplication from dawiq import dataclass2Widget import sys @@ -59,6 +61,7 @@ We then create a widget and display it. .. tab:: PySide2 .. code-block:: python + from PySide2.QtWidgets import QApplication from dawiq import dataclass2Widget import sys @@ -72,6 +75,7 @@ We then create a widget and display it. .. tab:: PyQt5 .. code-block:: python + from PyQt5.QtWidgets import QApplication from dawiq import dataclass2Widget import sys From ff0613dd163c3b59bd94ca8b40de73e5320ab463 Mon Sep 17 00:00:00 2001 From: Jisoo Song Date: Sun, 10 Sep 2023 14:20:27 +0900 Subject: [PATCH 3/3] doc: use sphinx-tabs Use code-tab --- .../explanation/optional-vs-default.rst | 180 +++-- doc/source/user-guide/highlight-widget.rst | 168 ++--- doc/source/user-guide/model.rst | 240 +++--- doc/source/user-guide/multi-dcls.rst | 696 ++++++++---------- doc/source/user-guide/widget.rst | 80 +- 5 files changed, 634 insertions(+), 730 deletions(-) diff --git a/doc/source/explanation/optional-vs-default.rst b/doc/source/explanation/optional-vs-default.rst index 65922e3..09aa9c9 100644 --- a/doc/source/explanation/optional-vs-default.rst +++ b/doc/source/explanation/optional-vs-default.rst @@ -62,125 +62,117 @@ How will the data widget from ``DataClass`` be? .. tabs:: - .. tab:: PySide6 + .. code-tab:: python PySide6 - .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem + from PySide6.QtWidgets import QApplication + from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget + import sys - from PySide6.QtGui import QStandardItemModel, QStandardItem - from PySide6.QtWidgets import QApplication - from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget - import sys + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + delegate = DataclassDelegate() + mapper = DataclassMapper() + mapper.setItemDelegate(delegate) + mapper.setModel(model) - delegate = DataclassDelegate() - mapper = DataclassMapper() - mapper.setItemDelegate(delegate) - mapper.setModel(model) + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + widget.show() + app.exec() + app.quit() - widget.show() - app.exec() - app.quit() + .. code-tab:: python PyQt6 - .. tab:: PyQt6 + from PyQt6.QtGui import QStandardItemModel, QStandardItem + from PyQt6.QtWidgets import QApplication + from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget + import sys - .. code-block:: python + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - from PyQt6.QtGui import QStandardItemModel, QStandardItem - from PyQt6.QtWidgets import QApplication - from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget - import sys + delegate = DataclassDelegate() + mapper = DataclassMapper() + mapper.setItemDelegate(delegate) + mapper.setModel(model) - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - delegate = DataclassDelegate() - mapper = DataclassMapper() - mapper.setItemDelegate(delegate) - mapper.setModel(model) + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + widget.show() + app.exec() + app.quit() - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + .. code-tab:: python PySide2 - widget.show() - app.exec() - app.quit() + from PySide2.QtGui import QStandardItemModel, QStandardItem + from PySide2.QtWidgets import QApplication + from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget + import sys - .. tab:: PySide2 + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-block:: python + delegate = DataclassDelegate() + mapper = DataclassMapper() + mapper.setItemDelegate(delegate) + mapper.setModel(model) - from PySide2.QtGui import QStandardItemModel, QStandardItem - from PySide2.QtWidgets import QApplication - from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget - import sys + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - delegate = DataclassDelegate() - mapper = DataclassMapper() - mapper.setItemDelegate(delegate) - mapper.setModel(model) + widget.show() + app.exec_() + app.quit() - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + .. code-tab:: python PyQt5 - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + from PyQt5.QtGui import QStandardItemModel, QStandardItem + from PyQt5.QtWidgets import QApplication + from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget + import sys - widget.show() - app.exec_() - app.quit() + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. tab:: PyQt5 + delegate = DataclassDelegate() + mapper = DataclassMapper() + mapper.setItemDelegate(delegate) + mapper.setModel(model) - .. code-block:: python - - from PyQt5.QtGui import QStandardItemModel, QStandardItem - from PyQt5.QtWidgets import QApplication - from dawiq import DataclassDelegate, DataclassMapper, dataclass2Widget - import sys - - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) - - delegate = DataclassDelegate() - mapper = DataclassMapper() - mapper.setItemDelegate(delegate) - mapper.setModel(model) - - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) - - widget.show() - app.exec() - app.quit() + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) + + widget.show() + app.exec() + app.quit() .. figure:: ../_images/optionalfield-example.jpg diff --git a/doc/source/user-guide/highlight-widget.rst b/doc/source/user-guide/highlight-widget.rst index 0bd693d..f1461dd 100644 --- a/doc/source/user-guide/highlight-widget.rst +++ b/doc/source/user-guide/highlight-widget.rst @@ -28,53 +28,45 @@ We construct a simple model with one item. .. tabs:: - .. tab:: PySide6 + .. code-tab:: python PySide6 - .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - from PySide6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + .. code-tab:: python PyQt6 - .. tab:: PyQt6 + from PyQt6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - .. code-block:: python + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - from PyQt6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-tab:: python PySide2 - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + from PySide2.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - .. tab:: PySide2 + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-block:: python + .. code-tab:: python PyQt5 - from PySide2.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + from PyQt5.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) - - .. tab:: PyQt5 - - .. code-block:: python - - from PyQt5.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate - - model = QStandardItemModel() - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) Now we construct the delegate and the mapper. @@ -92,81 +84,73 @@ Before running the application, we set the style sheet to :class:`QApplication`. .. tabs:: - .. tab:: PySide6 - - .. code-block:: python - - from PySide6.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys - - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + .. code-tab:: python PySide6 - widget.show() - app.exec() - app.quit() + from PySide6.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - .. tab:: PyQt6 + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - .. code-block:: python + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - from PyQt6.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + widget.show() + app.exec() + app.quit() - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + .. code-tab:: python PyQt6 - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + from PyQt6.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - widget.show() - app.exec() - app.quit() + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - .. tab:: PySide2 + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - .. code-block:: python + widget.show() + app.exec() + app.quit() - from PySide2.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + .. code-tab:: python PySide2 - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + from PySide2.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - widget.show() - app.exec_() - app.quit() + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - .. tab:: PyQt5 + widget.show() + app.exec_() + app.quit() - .. code-block:: python + .. code-tab:: python PyQt5 - from PyQt5.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + from PyQt5.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) - app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") + app = QApplication(sys.argv) + app.setStyleSheet("*[requiresFieldValue=true]{border: 1px solid red}") - widget = dataclass2Widget(DataClass) - mapper.addMapping(widget, 0) - mapper.setCurrentIndex(0) + widget = dataclass2Widget(DataClass) + mapper.addMapping(widget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec() - app.quit() + widget.show() + app.exec() + app.quit() Below is the image of the resulting widget. Required fields are marked with red boundaries, which are gone when we fill the value. diff --git a/doc/source/user-guide/model.rst b/doc/source/user-guide/model.rst index c8ae377..5fe6414 100644 --- a/doc/source/user-guide/model.rst +++ b/doc/source/user-guide/model.rst @@ -41,57 +41,49 @@ Then we construct a model with two items, each storing the dataclass type which .. tabs:: - .. tab:: PySide6 + .. code-tab:: python PySide6 - .. code-block:: python + from PySide6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - from PySide6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + model = QStandardItemModel() + for _ in range(2): + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - model = QStandardItemModel() - for _ in range(2): - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + .. code-tab:: python PyQt6 - .. tab:: PyQt6 + from PyQt6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - .. code-block:: python + model = QStandardItemModel() + for _ in range(2): + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - from PyQt6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-tab:: python PySide2 - model = QStandardItemModel() - for _ in range(2): - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + from PySide2.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - .. tab:: PySide2 + model = QStandardItemModel() + for _ in range(2): + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-block:: python + .. code-tab:: python PyQt5 - from PySide2.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + from PyQt5.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for _ in range(2): - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) - - .. tab:: PyQt5 - - .. code-block:: python - - from PyQt5.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate - - model = QStandardItemModel() - for _ in range(2): - item = QStandardItem() - item.setData(DataClass, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for _ in range(2): + item = QStandardItem() + item.setData(DataClass, role=DataclassDelegate.TypeRole) + model.appendRow(item) Now we construct the delegate and the mapper. @@ -112,121 +104,113 @@ The widget consists of: .. tabs:: - .. tab:: PySide6 - - .. code-block:: python - - from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from dawiq import dataclass2Widget - import sys - - app = QApplication(sys.argv) - - widget = QWidget() - widget.setLayout(QVBoxLayout()) - dataWidget = dataclass2Widget(DataClass) - widget.layout().addWidget(dataWidget) - btn1 = QPushButton("Previous") - widget.layout().addWidget(btn1) - btn2 = QPushButton("Next") - widget.layout().addWidget(btn2) + .. code-tab:: python PySide6 - btn1.clicked.connect(mapper.toPrevious) - btn2.clicked.connect(mapper.toNext) + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from dawiq import dataclass2Widget + import sys - mapper.addMapping(dataWidget, 0) - mapper.setCurrentIndex(0) + app = QApplication(sys.argv) - widget.show() - app.exec() - app.quit() + widget = QWidget() + widget.setLayout(QVBoxLayout()) + dataWidget = dataclass2Widget(DataClass) + widget.layout().addWidget(dataWidget) + btn1 = QPushButton("Previous") + widget.layout().addWidget(btn1) + btn2 = QPushButton("Next") + widget.layout().addWidget(btn2) - .. tab:: PyQt6 + btn1.clicked.connect(mapper.toPrevious) + btn2.clicked.connect(mapper.toNext) - .. code-block:: python + mapper.addMapping(dataWidget, 0) + mapper.setCurrentIndex(0) - from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from dawiq import dataclass2Widget - import sys + widget.show() + app.exec() + app.quit() - app = QApplication(sys.argv) + .. code-tab:: python PyQt6 - widget = QWidget() - widget.setLayout(QVBoxLayout()) - dataWidget = dataclass2Widget(DataClass) - widget.layout().addWidget(dataWidget) - btn1 = QPushButton("Previous") - widget.layout().addWidget(btn1) - btn2 = QPushButton("Next") - widget.layout().addWidget(btn2) + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from dawiq import dataclass2Widget + import sys - btn1.clicked.connect(mapper.toPrevious) - btn2.clicked.connect(mapper.toNext) + app = QApplication(sys.argv) - mapper.addMapping(dataWidget, 0) - mapper.setCurrentIndex(0) + widget = QWidget() + widget.setLayout(QVBoxLayout()) + dataWidget = dataclass2Widget(DataClass) + widget.layout().addWidget(dataWidget) + btn1 = QPushButton("Previous") + widget.layout().addWidget(btn1) + btn2 = QPushButton("Next") + widget.layout().addWidget(btn2) - widget.show() - app.exec() - app.quit() + btn1.clicked.connect(mapper.toPrevious) + btn2.clicked.connect(mapper.toNext) - .. tab:: PySide2 + mapper.addMapping(dataWidget, 0) + mapper.setCurrentIndex(0) - .. code-block:: python + widget.show() + app.exec() + app.quit() - from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from dawiq import dataclass2Widget - import sys + .. code-tab:: python PySide2 - app = QApplication(sys.argv) + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from dawiq import dataclass2Widget + import sys - widget = QWidget() - widget.setLayout(QVBoxLayout()) - dataWidget = dataclass2Widget(DataClass) - widget.layout().addWidget(dataWidget) - btn1 = QPushButton("Previous") - widget.layout().addWidget(btn1) - btn2 = QPushButton("Next") - widget.layout().addWidget(btn2) + app = QApplication(sys.argv) - btn1.clicked.connect(mapper.toPrevious) - btn2.clicked.connect(mapper.toNext) + widget = QWidget() + widget.setLayout(QVBoxLayout()) + dataWidget = dataclass2Widget(DataClass) + widget.layout().addWidget(dataWidget) + btn1 = QPushButton("Previous") + widget.layout().addWidget(btn1) + btn2 = QPushButton("Next") + widget.layout().addWidget(btn2) - mapper.addMapping(dataWidget, 0) - mapper.setCurrentIndex(0) + btn1.clicked.connect(mapper.toPrevious) + btn2.clicked.connect(mapper.toNext) - widget.show() - app.exec_() - app.quit() + mapper.addMapping(dataWidget, 0) + mapper.setCurrentIndex(0) - .. tab:: PyQt5 + widget.show() + app.exec_() + app.quit() - .. code-block:: python + .. code-tab:: python PyQt5 - from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from dawiq import dataclass2Widget - import sys + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) + app = QApplication(sys.argv) - widget = QWidget() - widget.setLayout(QVBoxLayout()) - dataWidget = dataclass2Widget(DataClass) - widget.layout().addWidget(dataWidget) - btn1 = QPushButton("Previous") - widget.layout().addWidget(btn1) - btn2 = QPushButton("Next") - widget.layout().addWidget(btn2) + widget = QWidget() + widget.setLayout(QVBoxLayout()) + dataWidget = dataclass2Widget(DataClass) + widget.layout().addWidget(dataWidget) + btn1 = QPushButton("Previous") + widget.layout().addWidget(btn1) + btn2 = QPushButton("Next") + widget.layout().addWidget(btn2) - btn1.clicked.connect(mapper.toPrevious) - btn2.clicked.connect(mapper.toNext) + btn1.clicked.connect(mapper.toPrevious) + btn2.clicked.connect(mapper.toNext) - mapper.addMapping(dataWidget, 0) - mapper.setCurrentIndex(0) + mapper.addMapping(dataWidget, 0) + mapper.setCurrentIndex(0) - widget.show() - app.exec() - app.quit() + widget.show() + app.exec() + app.quit() Below is the image of the resulting widget. Try change the model index and the editor data, and see if the data is stored and read correctly. diff --git a/doc/source/user-guide/multi-dcls.rst b/doc/source/user-guide/multi-dcls.rst index 248f7fa..f5050fb 100644 --- a/doc/source/user-guide/multi-dcls.rst +++ b/doc/source/user-guide/multi-dcls.rst @@ -45,222 +45,206 @@ Then we construct the widget with basic API, and add the dataclass types. .. tabs:: - .. tab:: PySide6 + .. code-tab:: python PySide6 - .. code-block:: python + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from PySide6.QtCore import Signal + from dawiq import DataclassTabWidget, dataclass2Widget + import sys - from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from PySide6.QtCore import Signal - from dawiq import DataclassTabWidget, dataclass2Widget - import sys + app = QApplication(sys.argv) - app = QApplication(sys.argv) + class MyWidget(QWidget): - class MyWidget(QWidget): + toPrevious = Signal() + toNext = Signal() - toPrevious = Signal() - toNext = Signal() + def __init__(self, parent=None): + super().__init__(parent) - def __init__(self, parent=None): - super().__init__(parent) + self.setLayout(QVBoxLayout()) - self.setLayout(QVBoxLayout()) + self.tabWidget = DataclassTabWidget() + self.layout().addWidget(self.tabWidget) - self.tabWidget = DataclassTabWidget() - self.layout().addWidget(self.tabWidget) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + def addDataclass(self, dcls): + self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - def addDataclass(self, dcls): - self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) + myWidget = MyWidget() - myWidget = MyWidget() + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + .. code-tab:: python PyQt6 - .. tab:: PyQt6 + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from PyQt6.QtCore import pyqtSignal + from dawiq import DataclassTabWidget, dataclass2Widget + import sys - .. code-block:: python + app = QApplication(sys.argv) - from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from PyQt6.QtCore import pyqtSignal - from dawiq import DataclassTabWidget, dataclass2Widget - import sys + class MyWidget(QWidget): - app = QApplication(sys.argv) + toPrevious = pyqtSignal() + toNext = pyqtSignal() - class MyWidget(QWidget): + def __init__(self, parent=None): + super().__init__(parent) - toPrevious = pyqtSignal() - toNext = pyqtSignal() + self.setLayout(QVBoxLayout()) - def __init__(self, parent=None): - super().__init__(parent) + self.tabWidget = DataclassTabWidget() + self.layout().addWidget(self.tabWidget) - self.setLayout(QVBoxLayout()) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.tabWidget = DataclassTabWidget() - self.layout().addWidget(self.tabWidget) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + def addDataclass(self, dcls): + self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + myWidget = MyWidget() - def addDataclass(self, dcls): - self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - myWidget = MyWidget() + .. code-tab:: python PySide2 - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from PySide2.QtCore import Signal + from dawiq import DataclassTabWidget, dataclass2Widget + import sys - .. tab:: PySide2 + app = QApplication(sys.argv) - .. code-block:: python + class MyWidget(QWidget): - from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from PySide2.QtCore import Signal - from dawiq import DataclassTabWidget, dataclass2Widget - import sys + toPrevious = Signal() + toNext = Signal() - app = QApplication(sys.argv) + def __init__(self, parent=None): + super().__init__(parent) - class MyWidget(QWidget): + self.setLayout(QVBoxLayout()) - toPrevious = Signal() - toNext = Signal() + self.tabWidget = DataclassTabWidget() + self.layout().addWidget(self.tabWidget) - def __init__(self, parent=None): - super().__init__(parent) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.setLayout(QVBoxLayout()) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - self.tabWidget = DataclassTabWidget() - self.layout().addWidget(self.tabWidget) + def addDataclass(self, dcls): + self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + myWidget = MyWidget() - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - def addDataclass(self, dcls): - self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) + .. code-tab:: python PyQt5 - myWidget = MyWidget() + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton + from PyQt5.QtCore import pyqtSignal + from dawiq import DataclassTabWidget, dataclass2Widget + import sys - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + app = QApplication(sys.argv) - .. tab:: PyQt5 + class MyWidget(QWidget): - .. code-block:: python + toPrevious = pyqtSignal() + toNext = pyqtSignal() - from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton - from PyQt5.QtCore import pyqtSignal - from dawiq import DataclassTabWidget, dataclass2Widget - import sys + def __init__(self, parent=None): + super().__init__(parent) - app = QApplication(sys.argv) + self.setLayout(QVBoxLayout()) - class MyWidget(QWidget): + self.tabWidget = DataclassTabWidget() + self.layout().addWidget(self.tabWidget) - toPrevious = pyqtSignal() - toNext = pyqtSignal() + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - def __init__(self, parent=None): - super().__init__(parent) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - self.setLayout(QVBoxLayout()) + def addDataclass(self, dcls): + self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - self.tabWidget = DataclassTabWidget() - self.layout().addWidget(self.tabWidget) + myWidget = MyWidget() - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) - - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) - - def addDataclass(self, dcls): - self.tabWidget.addDataWidget(dataclass2Widget(dcls), dcls, dcls.__name__) - - myWidget = MyWidget() - - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) Now we construct a model with two items, each having different data types. .. tabs:: - .. tab:: PySide6 - - .. code-block:: python - - from PySide6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + .. code-tab:: python PySide6 - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=DataclassDelegate.TypeRole) - model.appendRow(item) + from PySide6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - .. tab:: PyQt6 + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. code-block:: python + .. code-tab:: python PyQt6 - from PyQt6.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + from PyQt6.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=DataclassDelegate.TypeRole) + model.appendRow(item) - .. tab:: PySide2 + .. code-tab:: python PySide2 - .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - from PySide2.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=DataclassDelegate.TypeRole) + model.appendRow(item) - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=DataclassDelegate.TypeRole) - model.appendRow(item) + .. code-tab:: python PyQt5 - .. tab:: PyQt5 + from PyQt5.QtGui import QStandardItemModel, QStandardItem + from dawiq import DataclassDelegate - .. code-block:: python - - from PyQt5.QtGui import QStandardItemModel, QStandardItem - from dawiq import DataclassDelegate - - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=DataclassDelegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=DataclassDelegate.TypeRole) + model.appendRow(item) Finally we construct the delegate and the mapper, and set up the system. @@ -282,49 +266,41 @@ Now let's set the data and display the widget. .. tabs:: - .. tab:: PySide6 - - .. code-block:: python - - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - - myWidget.show() - app.exec() - app.quit() - - .. tab:: PyQt6 + .. code-tab:: python PySide6 - .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + myWidget.show() + app.exec() + app.quit() - myWidget.show() - app.exec() - app.quit() + .. code-tab:: python PyQt6 - .. tab:: PySide2 + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - .. code-block:: python + myWidget.show() + app.exec() + app.quit() - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-tab:: python PySide2 - myWidget.show() - app.exec_() - app.quit() + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - .. tab:: PyQt5 + myWidget.show() + app.exec_() + app.quit() - .. code-block:: python + .. code-tab:: python PyQt5 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec() - app.quit() + myWidget.show() + app.exec() + app.quit() .. figure:: ../_images/dcls-tab-example.jpg :align: center @@ -347,185 +323,177 @@ Dataclasses are same to :ref:`multi-dcls-basic`, so we go directly to widget con .. tabs:: - .. tab:: PySide6 + .. code-tab:: python PySide6 - .. code-block:: python + from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton + from PySide6.QtCore import Signal + from dawiq import DataclassStackedWidget, dataclass2Widget + import sys - from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton - from PySide6.QtCore import Signal - from dawiq import DataclassStackedWidget, dataclass2Widget - import sys + app = QApplication(sys.argv) - app = QApplication(sys.argv) + class MyWidget(QWidget): - class MyWidget(QWidget): + toPrevious = Signal() + toNext = Signal() - toPrevious = Signal() - toNext = Signal() + def __init__(self, parent=None): + super().__init__(parent) - def __init__(self, parent=None): - super().__init__(parent) + self.setLayout(QVBoxLayout()) - self.setLayout(QVBoxLayout()) + self.comboBox = QComboBox() + self.comboBox.setPlaceholderText("Select dataclass type") + self.layout().addWidget(self.comboBox) - self.comboBox = QComboBox() - self.comboBox.setPlaceholderText("Select dataclass type") - self.layout().addWidget(self.comboBox) + self.stackedWidget = DataclassStackedWidget() + self.layout().addWidget(self.stackedWidget) - self.stackedWidget = DataclassStackedWidget() - self.layout().addWidget(self.stackedWidget) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + def addDataclass(self, dcls): + self.comboBox.addItem(dcls.__name__, dcls) + self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - def addDataclass(self, dcls): - self.comboBox.addItem(dcls.__name__, dcls) - self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) + myWidget = MyWidget() - myWidget = MyWidget() + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + .. code-tab:: python PyQt6 - .. tab:: PyQt6 + from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton + from PyQt6.QtCore import pyqtSignal + from dawiq import DataclassStackedWidget, dataclass2Widget + import sys - .. code-block:: python + app = QApplication(sys.argv) - from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton - from PyQt6.QtCore import pyqtSignal - from dawiq import DataclassStackedWidget, dataclass2Widget - import sys + class MyWidget(QWidget): - app = QApplication(sys.argv) + toPrevious = pyqtSignal() + toNext = pyqtSignal() - class MyWidget(QWidget): + def __init__(self, parent=None): + super().__init__(parent) - toPrevious = pyqtSignal() - toNext = pyqtSignal() + self.setLayout(QVBoxLayout()) - def __init__(self, parent=None): - super().__init__(parent) + self.comboBox = QComboBox() + self.comboBox.setPlaceholderText("Select dataclass type") + self.layout().addWidget(self.comboBox) - self.setLayout(QVBoxLayout()) + self.stackedWidget = DataclassStackedWidget() + self.layout().addWidget(self.stackedWidget) - self.comboBox = QComboBox() - self.comboBox.setPlaceholderText("Select dataclass type") - self.layout().addWidget(self.comboBox) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.stackedWidget = DataclassStackedWidget() - self.layout().addWidget(self.stackedWidget) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + def addDataclass(self, dcls): + self.comboBox.addItem(dcls.__name__, dcls) + self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + myWidget = MyWidget() - def addDataclass(self, dcls): - self.comboBox.addItem(dcls.__name__, dcls) - self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - myWidget = MyWidget() + .. code-tab:: python PySide2 - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton + from PySide2.QtCore import Signal + from dawiq import DataclassStackedWidget, dataclass2Widget + import sys - .. tab:: PySide2 + app = QApplication(sys.argv) - .. code-block:: python + class MyWidget(QWidget): - from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton - from PySide2.QtCore import Signal - from dawiq import DataclassStackedWidget, dataclass2Widget - import sys + toPrevious = Signal() + toNext = Signal() - app = QApplication(sys.argv) + def __init__(self, parent=None): + super().__init__(parent) - class MyWidget(QWidget): + self.setLayout(QVBoxLayout()) - toPrevious = Signal() - toNext = Signal() + self.comboBox = QComboBox() + self.comboBox.setPlaceholderText("Select dataclass type") + self.layout().addWidget(self.comboBox) - def __init__(self, parent=None): - super().__init__(parent) + self.stackedWidget = DataclassStackedWidget() + self.layout().addWidget(self.stackedWidget) - self.setLayout(QVBoxLayout()) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.comboBox = QComboBox() - self.comboBox.setPlaceholderText("Select dataclass type") - self.layout().addWidget(self.comboBox) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - self.stackedWidget = DataclassStackedWidget() - self.layout().addWidget(self.stackedWidget) + def addDataclass(self, dcls): + self.comboBox.addItem(dcls.__name__, dcls) + self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) + myWidget = MyWidget() - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) - def addDataclass(self, dcls): - self.comboBox.addItem(dcls.__name__, dcls) - self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) + .. code-tab:: python PyQt5 - myWidget = MyWidget() + from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton + from PyQt5.QtCore import pyqtSignal + from dawiq import DataclassStackedWidget, dataclass2Widget + import sys - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + app = QApplication(sys.argv) - .. tab:: PyQt5 + class MyWidget(QWidget): - .. code-block:: python + toPrevious = pyqtSignal() + toNext = pyqtSignal() - from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton - from PyQt5.QtCore import pyqtSignal - from dawiq import DataclassStackedWidget, dataclass2Widget - import sys + def __init__(self, parent=None): + super().__init__(parent) - app = QApplication(sys.argv) + self.setLayout(QVBoxLayout()) - class MyWidget(QWidget): + self.comboBox = QComboBox() + self.comboBox.setPlaceholderText("Select dataclass type") + self.layout().addWidget(self.comboBox) - toPrevious = pyqtSignal() - toNext = pyqtSignal() + self.stackedWidget = DataclassStackedWidget() + self.layout().addWidget(self.stackedWidget) - def __init__(self, parent=None): - super().__init__(parent) + self.btn1 = QPushButton("Previous") + self.btn2 = QPushButton("Next") + self.layout().addWidget(self.btn1) + self.layout().addWidget(self.btn2) - self.setLayout(QVBoxLayout()) + self.btn1.clicked.connect(self.toPrevious) + self.btn2.clicked.connect(self.toNext) - self.comboBox = QComboBox() - self.comboBox.setPlaceholderText("Select dataclass type") - self.layout().addWidget(self.comboBox) + def addDataclass(self, dcls): + self.comboBox.addItem(dcls.__name__, dcls) + self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - self.stackedWidget = DataclassStackedWidget() - self.layout().addWidget(self.stackedWidget) + myWidget = MyWidget() - self.btn1 = QPushButton("Previous") - self.btn2 = QPushButton("Next") - self.layout().addWidget(self.btn1) - self.layout().addWidget(self.btn2) - - self.btn1.clicked.connect(self.toPrevious) - self.btn2.clicked.connect(self.toNext) - - def addDataclass(self, dcls): - self.comboBox.addItem(dcls.__name__, dcls) - self.stackedWidget.addDataWidget(dataclass2Widget(dcls), dcls) - - myWidget = MyWidget() - - for dcls in [DataClass1, DataClass2]: - myWidget.addDataclass(dcls) + for dcls in [DataClass1, DataClass2]: + myWidget.addDataclass(dcls) We need to define a delegate so that it can synchronize ``DataclassStackedWidget`` and ``QComboBox``. @@ -555,53 +523,45 @@ Now we construct a model with two items, each having different data types. .. tabs:: - .. tab:: PySide6 - - .. code-block:: python - - from PySide6.QtGui import QStandardItemModel, QStandardItem + .. code-tab:: python PySide6 - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=delegate.TypeRole) - model.appendRow(item) + from PySide6.QtGui import QStandardItemModel, QStandardItem - .. tab:: PyQt6 + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=delegate.TypeRole) + model.appendRow(item) - .. code-block:: python + .. code-tab:: python PyQt6 - from PyQt6.QtGui import QStandardItemModel, QStandardItem + from PyQt6.QtGui import QStandardItemModel, QStandardItem - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=delegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=delegate.TypeRole) + model.appendRow(item) - .. tab:: PySide2 + .. code-tab:: python PySide2 - .. code-block:: python + from PySide2.QtGui import QStandardItemModel, QStandardItem - from PySide2.QtGui import QStandardItemModel, QStandardItem + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=delegate.TypeRole) + model.appendRow(item) - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=delegate.TypeRole) - model.appendRow(item) + .. code-tab:: python PyQt5 - .. tab:: PyQt5 + from PyQt5.QtGui import QStandardItemModel, QStandardItem - .. code-block:: python - - from PyQt5.QtGui import QStandardItemModel, QStandardItem - - model = QStandardItemModel() - for dcls in [DataClass1, DataClass2]: - item = QStandardItem() - item.setData(dcls, role=delegate.TypeRole) - model.appendRow(item) + model = QStandardItemModel() + for dcls in [DataClass1, DataClass2]: + item = QStandardItem() + item.setData(dcls, role=delegate.TypeRole) + model.appendRow(item) We also need to define a mapper so that whenever the combo box index changes the model will get updated too. @@ -634,49 +594,41 @@ Now let's set the data and display the widget. .. tabs:: - .. tab:: PySide6 - - .. code-block:: python - - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - - myWidget.show() - app.exec() - app.quit() - - .. tab:: PyQt6 + .. code-tab:: python PySide6 - .. code-block:: python + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + myWidget.show() + app.exec() + app.quit() - myWidget.show() - app.exec() - app.quit() + .. code-tab:: python PyQt6 - .. tab:: PySide2 + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - .. code-block:: python + myWidget.show() + app.exec() + app.quit() - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + .. code-tab:: python PySide2 - myWidget.show() - app.exec_() - app.quit() + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - .. tab:: PyQt5 + myWidget.show() + app.exec_() + app.quit() - .. code-block:: python + .. code-tab:: python PyQt5 - model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) - model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) + model.setData(model.index(0, 0), dict(x=1.0), delegate.DataRole) + model.setData(model.index(1, 0), dict(y=2), delegate.DataRole) - myWidget.show() - app.exec() - app.quit() + myWidget.show() + app.exec() + app.quit() .. figure:: ../_images/dcls-custom-example.jpg :align: center diff --git a/doc/source/user-guide/widget.rst b/doc/source/user-guide/widget.rst index 8984bd7..0c9a938 100644 --- a/doc/source/user-guide/widget.rst +++ b/doc/source/user-guide/widget.rst @@ -30,61 +30,53 @@ We then create a widget and display it. .. tabs:: - .. tab:: PySide6 + .. code-tab:: python PySide6 - .. code-block:: python + from PySide6.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - from PySide6.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + app = QApplication(sys.argv) + dataWidget = dataclass2Widget(DataClass) + dataWidget.show() + app.exec() + app.quit() - app = QApplication(sys.argv) - dataWidget = dataclass2Widget(DataClass) - dataWidget.show() - app.exec() - app.quit() + .. code-tab:: python PyQt6 - .. tab:: PyQt6 + from PyQt6.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - .. code-block:: python + app = QApplication(sys.argv) + dataWidget = dataclass2Widget(DataClass) + dataWidget.show() + app.exec() + app.quit() - from PyQt6.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + .. code-tab:: python PySide2 - app = QApplication(sys.argv) - dataWidget = dataclass2Widget(DataClass) - dataWidget.show() - app.exec() - app.quit() + from PySide2.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - .. tab:: PySide2 + app = QApplication(sys.argv) + dataWidget = dataclass2Widget(DataClass) + dataWidget.show() + app.exec_() + app.quit() - .. code-block:: python + .. code-tab:: python PyQt5 - from PySide2.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys + from PyQt5.QtWidgets import QApplication + from dawiq import dataclass2Widget + import sys - app = QApplication(sys.argv) - dataWidget = dataclass2Widget(DataClass) - dataWidget.show() - app.exec_() - app.quit() - - .. tab:: PyQt5 - - .. code-block:: python - - from PyQt5.QtWidgets import QApplication - from dawiq import dataclass2Widget - import sys - - app = QApplication(sys.argv) - dataWidget = dataclass2Widget(DataClass) - dataWidget.show() - app.exec() - app.quit() + app = QApplication(sys.argv) + dataWidget = dataclass2Widget(DataClass) + dataWidget.show() + app.exec() + app.quit() Your widget will look like this: