---
title: 'Come aggiungere un widget personalizzato a uno script di Processing'
url: 'https://www.faunalia.eu/it/blog/2019-07-02-custom-processing-widget'
markdown: 'https://www.faunalia.eu/it/blog/2019-07-02-custom-processing-widget.md'
lang: it
date: '2019-07-03'
description: 'Custom widget Processing QGIS'
taxonomy:
  category:
    - blog
  tag:
    - qgis
    - processing
    - python
  archives_month:
    - jul_2019
  archives_year:
    - '2019'
---

[ Faunalia ](https://www.faunalia.eu/it)     [ Blog ](https://www.faunalia.eu/it/blog)      Come aggiungere un widget personalizzato a uno script di Processing    

## [Come aggiungere un widget personalizzato a uno script di Processing](https://www.faunalia.eu/it/blog/2019-07-02-custom-processing-widget)

    3rd Jul 2019

  [qgis](https://www.faunalia.eu/it/blog/tag:qgis) [processing](https://www.faunalia.eu/it/blog/tag:processing) [python](https://www.faunalia.eu/it/blog/tag:python)  

# Widget personalizzati in script di Processing

Tramite Processing si possono aggiungere script che estendono le funzionalità di QGIS.

Se avete dimestichezza con la sintassi degli script di Processing sapete che la tipologia di parametri che si possono aggiungere come input sono moltissimi:

- numeri
- vettori
- file
- raster
- [qui una lista completa](https://docs.qgis.org/testing/en/docs/user_manual/processing/console.html#creating-scripts-and-running-them-from-the-toolbox)

Se volessimo aggiungere noi un parametro ad hoc per la nostra analisi? Per esempio un parametro di tipologia `DateTime` con un pulsante che apre un calendario?

Processing permette di aggiungere widget personalizzati in modo piuttosto semplice. Nell'esempio che segue lo script non farà niente di straordinario, mi sono limitato a modificare leggermente il template dello script con il parametro aggiuntivo, il resto sta a voi.

Procediamo per step.

0. Creare un nuovo script da template con il pulsante dedicato (funzionalità sviluppata da noi):

    ![Processing script template](https://www.faunalia.eu/images/9/9/a/7/0/99a70f77e86944cd9b73b470797148973fd1d31b-img.png)
1. bisogna importare qualche classe prima di iniziare:

    ```python
    from processing.gui.wrappers import WidgetWrapper
    from qgis.PyQt.QtWidgets import QDateTimeEdit
    from qgis.PyQt.QtCore import QCoreApplication, QDate
    from qgis.core import (QgsProcessing,
                       QgsFeatureSink,
                       QgsProcessingException,
                       QgsProcessingAlgorithm,
                       QgsProcessingParameterString,
                       QgsProcessingParameterFeatureSource,
                       QgsProcessingParameterFeatureSink)
    ```
2. Creare un altra classe che **deve** ereditare dalla classe `WidgetWrapper`. Qui dobbiamo specificare tutte le impostazioni del nostro widget, come la possibilità di aggiungere il pulsante calendario:

    ```python

    class DateTimeWidget(WidgetWrapper):
        """
        QDateTimeEdit widget with calendar pop up
        """

        def createWidget(self):
            self._combo = QDateTimeEdit()
            self._combo.setCalendarPopup(True)

            today = QDate.currentDate()
            self._combo.setDate(today)

            return self._combo

        def value(self):
            date_chosen = self._combo.dateTime()
            return date_chosen.toString(Qt.ISODate)
    ```

    la classe ha un metodo, `createWidget` che crea il widget e un altro metodo, `value` che restituisce il *valore* del widget, ovvero la data (in questo caso ho deciso di gestirla come stringa).
3. all'interno del metodo `initAlgorithm` della classe principale dell'algoritmo, quindi la classe che eredita dalla classe `QgsProcessingAlgorithm`, dobbiamo specificare come Processing dovrà costruire l'interfaccia del widget:

    ```python

      class myAlgorithm(QgsProcessingAlgorithm):

          ....

          DATEINI = 'DATEINI'

          ....

        def initAlgorithm(self, config=None):

            param = QgsProcessingParameterString(self.DATEINI, 'Initial Date')
            param.setMetadata({
                'widget_wrapper': {
                    'class': DateTimeWidget}})

            self.addParameter(param)

    ```
4. ultimo step, all'interno del metodo `processAlgorithm` dobbiamo prendere il valore del widget e assegnarlo a una variabile per farci successivamente quello che vogliamo:

    ```python

      mydate = self.parameterAsString(
          parameters,
          self.INIDATE,
          context
      )

    ```

Ed ecco il risultato finale:

![Processing script UI](https://www.faunalia.eu/user/pages/08.blog/2019-07-02-custom-processing-widget/ui.png)

Happy Processing coding!

 [  Articolo precedente ](https://www.faunalia.eu/it/blog/2019-06-03_dataplotly_target_reached) [Prossimo articolo  ](https://www.faunalia.eu/it/blog/2019-09-03-qhurricane)

#### Articoli correlati

- 100 

     [News from DataPlotly!](https://www.faunalia.eu/it/blog/2022-08-30_dataplotly-news "News from DataPlotly!")
- 100 

     [Grafici nel compositore di stampe di QGIS — DataPlotly Beta è pronto!](https://www.faunalia.eu/it/blog/2019-09-26-dataplotly-beta "Grafici nel compositore di stampe di QGIS — DataPlotly Beta è pronto!")
- 100 

     [Campagna di Crowdfunding per miglioramento compositore di stampe di QGIS](https://www.faunalia.eu/it/blog/2019-03-13_dataplotly "Campagna di Crowdfunding per miglioramento compositore di stampe di QGIS")
- 90 

     [Un ottimo inizio anno](https://www.faunalia.eu/it/blog/2020-01-01_nuovo_anno "Un ottimo inizio anno")
- 80 

     [QGIS Day 2019 - Firenze](https://www.faunalia.eu/it/blog/2019-12-09-qgis-day "QGIS Day 2019 - Firenze")

#### Tag popolari

  [qgis](https://www.faunalia.eu/it/blog/tag:qgis) [dataplotly](https://www.faunalia.eu/it/blog/tag:dataplotly) [open source](https://www.faunalia.eu/it/blog/tag:open%20source) [python](https://www.faunalia.eu/it/blog/tag:python) [crowdfunding](https://www.faunalia.eu/it/blog/tag:crowdfunding) [online](https://www.faunalia.eu/it/blog/tag:online) [processing](https://www.faunalia.eu/it/blog/tag:processing) [lrs](https://www.faunalia.eu/it/blog/tag:lrs) [ecw](https://www.faunalia.eu/it/blog/tag:ecw) [bug](https://www.faunalia.eu/it/blog/tag:bug) [grib](https://www.faunalia.eu/it/blog/tag:grib) [faunalia](https://www.faunalia.eu/it/blog/tag:faunalia) [plotly](https://www.faunalia.eu/it/blog/tag:plotly) [flask](https://www.faunalia.eu/it/blog/tag:flask) [dash](https://www.faunalia.eu/it/blog/tag:dash) [remote](https://www.faunalia.eu/it/blog/tag:remote) [pyqgis](https://www.faunalia.eu/it/blog/tag:pyqgis) [gdal](https://www.faunalia.eu/it/blog/tag:gdal) [plugin](https://www.faunalia.eu/it/blog/tag:plugin)  

#### Archivio

- [ 1 October 2022  ](https://www.faunalia.eu/it/blog/archives_month:oct_2022)
- [ 1 August 2022  ](https://www.faunalia.eu/it/blog/archives_month:aug_2022)
- [ 1 May 2021  ](https://www.faunalia.eu/it/blog/archives_month:may_2021)
- [ 1 March 2021  ](https://www.faunalia.eu/it/blog/archives_month:mar_2021)
- [ 4 February 2021  ](https://www.faunalia.eu/it/blog/archives_month:feb_2021)
- [ 1 December 2020  ](https://www.faunalia.eu/it/blog/archives_month:dec_2020)
- [ 1 May 2020  ](https://www.faunalia.eu/it/blog/archives_month:may_2020)
- [ 2 April 2020  ](https://www.faunalia.eu/it/blog/archives_month:apr_2020)
- [ 1 March 2020  ](https://www.faunalia.eu/it/blog/archives_month:mar_2020)
- [ 2 January 2020  ](https://www.faunalia.eu/it/blog/archives_month:jan_2020)
- [ 1 December 2019  ](https://www.faunalia.eu/it/blog/archives_month:dec_2019)
- [ 1 October 2019  ](https://www.faunalia.eu/it/blog/archives_month:oct_2019)

---

## Navigation

- Parent: [Blog](https://www.faunalia.eu/it/blog.md)
- Previous: [Dati Mesh e QGIS](https://www.faunalia.eu/it/blog/2019-09-03-qhurricane.md)
- Next: [DataPlotly obiettivo raggiunto!](https://www.faunalia.eu/it/blog/2019-06-03_dataplotly_target_reached.md)
