You can write python script in Processing to write your own algorithm.
If you already know how to write Processing scripts, then you also know that you can add many parameter types
But if you want to add another parameter type? How to add for example a DateTime
like parameter with a pop-up calendar button?
In the following example I just took the template script and added the parameter:
it is up to you to take that DateTime
value and make whatever you want!
Let's proceed by steps:
Create a new script with the dedicated button:
Some imports before to start creating the widget:
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)
We have to create a class that must inherit from the WidgetWrapper
class. Within this class we will specify all the widget settings, like the
pop-up button, the default date, etc:
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)
the class has two methods: the first one, createWidget
, creates the widget,
the second one, velue
, returns the value of the widget, in this case the
datetime value
Within the method initAlgorithm
of the main algorithm class, we must tell
Processing how to build the UI with the widget:
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)
Last step, within the processAlgorithm
method we should retrieve the widget
value and create a variable with the results to make whatever we want to do:
mydate = self.parameterAsString(
parameters,
self.INIDATE,
context
)
And here we go:
Happy Processing coding!