42 mStartDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
43 mEndDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
44 mFixedRangeStartDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
45 mFixedRangeEndDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
47 connect( mForwardButton, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::togglePlayForward );
48 connect( mBackButton, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::togglePlayBackward );
49 connect( mStopButton, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::togglePause );
54 connect( mLoopingCheckBox, &QCheckBox::toggled,
this, [ = ](
bool state ) { mNavigationObject->
setLooping( state ); } );
56 setWidgetStateFromNavigationMode( mNavigationObject->
navigationMode() );
61 if ( mBlockFrameDurationUpdates )
64 mBlockFrameDurationUpdates++;
65 updateTimeStepInputs( timeStep );
66 mBlockFrameDurationUpdates--;
68 connect( mNavigationOff, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationOff_clicked );
69 connect( mNavigationFixedRange, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationFixedRange_clicked );
70 connect( mNavigationAnimated, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationAnimated_clicked );
79 connect( mStartDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::startEndDateTime_changed );
80 connect( mEndDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::startEndDateTime_changed );
81 connect( mFixedRangeStartDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed );
82 connect( mFixedRangeEndDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed );
83 connect( mStepSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ),
this, &QgsTemporalControllerWidget::updateFrameDuration );
84 connect( mTimeStepsComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, &QgsTemporalControllerWidget::updateFrameDuration );
85 connect( mSlider, &QSlider::valueChanged,
this, &QgsTemporalControllerWidget::timeSlider_valueChanged );
87 mStepSpinBox->setClearValue( 1 );
91 connect( mSettings, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::settings_clicked );
95 mRangeMenu.reset(
new QMenu(
this ) );
97 mRangeSetToAllLayersAction =
new QAction( tr(
"Set to Full Range" ), mRangeMenu.get() );
99 connect( mRangeSetToAllLayersAction, &QAction::triggered,
this, &QgsTemporalControllerWidget::mRangeSetToAllLayersAction_triggered );
100 mRangeMenu->addAction( mRangeSetToAllLayersAction );
102 mRangeSetToProjectAction =
new QAction( tr(
"Set to Preset Project Range" ), mRangeMenu.get() );
103 connect( mRangeSetToProjectAction, &QAction::triggered,
this, &QgsTemporalControllerWidget::mRangeSetToProjectAction_triggered );
104 mRangeMenu->addAction( mRangeSetToProjectAction );
106 mRangeMenu->addSeparator();
108 mRangeLayersSubMenu.reset(
new QMenu( tr(
"Set to Single Layer's Range" ), mRangeMenu.get() ) );
109 mRangeLayersSubMenu->setEnabled(
false );
110 mRangeMenu->addMenu( mRangeLayersSubMenu.get() );
111 connect( mRangeMenu.get(), &QMenu::aboutToShow,
this, &QgsTemporalControllerWidget::aboutToShowRangeMenu );
113 mSetRangeButton->setPopupMode( QToolButton::MenuButtonPopup );
114 mSetRangeButton->setMenu( mRangeMenu.get() );
115 mSetRangeButton->setDefaultAction( mRangeSetToAllLayersAction );
116 mFixedRangeSetRangeButton->setPopupMode( QToolButton::MenuButtonPopup );
117 mFixedRangeSetRangeButton->setMenu( mRangeMenu.get() );
118 mFixedRangeSetRangeButton->setDefaultAction( mRangeSetToAllLayersAction );
122 QgsDateTimeRange range;
127 if ( range.begin().isValid() && range.end().isValid() )
129 whileBlocking( mStartDateTime )->setDateTime( range.begin() );
131 whileBlocking( mFixedRangeStartDateTime )->setDateTime( range.begin() );
132 whileBlocking( mFixedRangeEndDateTime )->setDateTime( range.end() );
157 mStepSpinBox->setDecimals( 3 );
159 mStepSpinBox->setMinimum( 0.001 );
160 mStepSpinBox->setMaximum( std::numeric_limits<int>::max() );
161 mStepSpinBox->setSingleStep( 1 );
162 mStepSpinBox->setValue( 1 );
164 mForwardButton->setToolTip( tr(
"Play" ) );
165 mBackButton->setToolTip( tr(
"Reverse" ) );
166 mNextButton->setToolTip( tr(
"Go to next frame" ) );
167 mPreviousButton->setToolTip( tr(
"Go to previous frame" ) );
168 mStopButton->setToolTip( tr(
"Pause" ) );
169 mRewindButton->setToolTip( tr(
"Rewind to start" ) );
170 mFastForwardButton->setToolTip( tr(
"Fast forward to end" ) );
172 updateFrameDuration();
186 if ( mSlider->hasFocus() && e->key() == Qt::Key_Space )
190 QWidget::keyPressEvent( e );
193 void QgsTemporalControllerWidget::aboutToShowRangeMenu()
195 QgsDateTimeRange projectRange;
198 mRangeSetToProjectAction->setEnabled( projectRange.begin().isValid() && projectRange.end().isValid() );
200 mRangeLayersSubMenu->clear();
201 for (
int i = 0; i < mMapLayerModel->
rowCount(); ++i )
203 QModelIndex index = mMapLayerModel->
index( i, 0 );
208 QIcon icon = qvariant_cast<QIcon>( mMapLayerModel->
data( index, Qt::DecorationRole ) );
209 QString text = mMapLayerModel->
data( index, Qt::DisplayRole ).toString();
211 if ( range.begin().isValid() && range.end().isValid() )
213 QAction *action =
new QAction( icon, text, mRangeLayersSubMenu.get() );
214 connect( action, &QAction::triggered,
this, [ = ]
217 saveRangeToProject();
219 mRangeLayersSubMenu->addAction( action );
222 mRangeLayersSubMenu->setEnabled( !mRangeLayersSubMenu->actions().isEmpty() );
225 void QgsTemporalControllerWidget::togglePlayForward()
227 mPlayingForward =
true;
231 mStopButton->setChecked(
false );
232 mBackButton->setChecked(
false );
233 mForwardButton->setChecked(
true );
238 mBackButton->setChecked(
true );
239 mForwardButton->setChecked(
false );
240 mNavigationObject->
pause();
244 void QgsTemporalControllerWidget::togglePlayBackward()
246 mPlayingForward =
false;
250 mStopButton->setChecked(
false );
251 mBackButton->setChecked(
true );
252 mForwardButton->setChecked(
false );
257 mBackButton->setChecked(
true );
258 mBackButton->setChecked(
false );
259 mNavigationObject->
pause();
263 void QgsTemporalControllerWidget::togglePause()
267 mStopButton->setChecked(
true );
268 mBackButton->setChecked(
false );
269 mForwardButton->setChecked(
false );
270 mNavigationObject->
pause();
274 mBackButton->setChecked( mPlayingForward ?
false :
true );
275 mForwardButton->setChecked( mPlayingForward ?
false :
true );
276 if ( mPlayingForward )
287 void QgsTemporalControllerWidget::updateTemporalExtent()
291 const QDateTime start = mStartDateTime->dateTime();
292 const QDateTime end = mEndDateTime->dateTime();
293 const bool isTimeInstant = start == end;
294 QgsDateTimeRange temporalExtent = QgsDateTimeRange( start, end,
301 void QgsTemporalControllerWidget::updateFrameDuration()
303 if ( mBlockSettingUpdates )
311 if ( !mBlockFrameDurationUpdates )
323 mStepSpinBox->setEnabled(
false );
324 mStepSpinBox->setValue( 1 );
325 mSlider->setTickInterval( 1 );
326 mSlider->setTickPosition( QSlider::TicksBothSides );
330 mStepSpinBox->setEnabled(
true );
331 mSlider->setTickInterval( 0 );
332 mSlider->setTickPosition( QSlider::NoTicks );
336 void QgsTemporalControllerWidget::setWidgetStateFromProject()
338 mBlockSettingUpdates++;
341 mBlockSettingUpdates--;
345 QStringLiteral(
"/NavigationMode" ), 0, &ok ) );
349 setWidgetStateFromNavigationMode( mode );
357 const QString startString =
QgsProject::instance()->
readEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/StartDateTime" ) );
358 const QString endString =
QgsProject::instance()->
readEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/EndDateTime" ) );
359 if ( !startString.isEmpty() && !endString.isEmpty() )
361 whileBlocking( mStartDateTime )->setDateTime( QDateTime::fromString( startString, Qt::ISODateWithMs ) );
362 whileBlocking( mEndDateTime )->setDateTime( QDateTime::fromString( endString, Qt::ISODateWithMs ) );
363 whileBlocking( mFixedRangeStartDateTime )->setDateTime( QDateTime::fromString( startString, Qt::ISODateWithMs ) );
364 whileBlocking( mFixedRangeEndDateTime )->setDateTime( QDateTime::fromString( endString, Qt::ISODateWithMs ) );
368 setDatesToProjectTime();
370 updateTemporalExtent();
371 updateFrameDuration();
377 void QgsTemporalControllerWidget::mNavigationOff_clicked()
386 void QgsTemporalControllerWidget::mNavigationFixedRange_clicked()
395 void QgsTemporalControllerWidget::mNavigationAnimated_clicked()
413 mNavigationModeStackedWidget->setCurrentIndex( 0 );
416 mNavigationModeStackedWidget->setCurrentIndex( 1 );
419 mNavigationModeStackedWidget->setCurrentIndex( 2 );
424 void QgsTemporalControllerWidget::onLayersAdded(
const QList<QgsMapLayer *> &layers )
426 if ( !mHasTemporalLayersLoaded )
430 if ( layer->temporalProperties() )
432 mHasTemporalLayersLoaded |= layer->temporalProperties()->isActive();
434 if ( !mHasTemporalLayersLoaded )
438 if ( layer->isValid() && layer->temporalProperties()->isActive() && !mHasTemporalLayersLoaded )
440 mHasTemporalLayersLoaded = true;
441 firstTemporalLayerLoaded( layer );
442 mNavigationObject->setAvailableTemporalRanges( QgsTemporalUtils::usedTemporalRangesForProject( QgsProject::instance() ) );
447 firstTemporalLayerLoaded( layer );
455 void QgsTemporalControllerWidget::firstTemporalLayerLoaded(
QgsMapLayer *layer )
457 setDatesToProjectTime();
459 if (
QgsMeshLayer *meshLayer = qobject_cast<QgsMeshLayer *>( layer ) )
461 mBlockFrameDurationUpdates++;
462 setTimeStep( meshLayer->firstValidTimeStep() );
463 mBlockFrameDurationUpdates--;
464 updateFrameDuration();
466 else if (
QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer ) )
468 if ( rasterLayer->dataProvider() && rasterLayer->dataProvider()->temporalCapabilities() )
470 mBlockFrameDurationUpdates++;
471 setTimeStep( rasterLayer->dataProvider()->temporalCapabilities()->defaultInterval() );
472 mBlockFrameDurationUpdates--;
473 updateFrameDuration();
478 void QgsTemporalControllerWidget::onProjectCleared()
480 mHasTemporalLayersLoaded =
false;
487 const QTime startOfCurrentHour = QTime( QTime::currentTime().hour(), 0, 0 );
488 const QDateTime end = QDateTime( QDate::currentDate(), startOfCurrentHour, Qt::UTC );
489 const QDateTime start = end.addSecs( -24 * 60 * 60 );
493 whileBlocking( mFixedRangeStartDateTime )->setDateTime( start );
496 updateTemporalExtent();
498 mStepSpinBox->setValue( 1 );
501 void QgsTemporalControllerWidget::updateSlider(
const QgsDateTimeRange &range )
504 updateRangeLabel( range );
507 void QgsTemporalControllerWidget::updateRangeLabel(
const QgsDateTimeRange &range )
509 QString timeFrameFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss" );
512 timeFrameFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss.zzz" );
516 mCurrentRangeLabel->setText( tr(
"Current frame: %1 ≤ <i>t</i> < %2" ).arg(
517 range.begin().toString( timeFrameFormat ),
518 range.end().toString( timeFrameFormat ) ) );
521 mCurrentRangeLabel->setText( tr(
"Range: %1 ≤ <i>t</i> < %2" ).arg(
522 range.begin().toString( timeFrameFormat ),
523 range.end().toString( timeFrameFormat ) ) );
526 mCurrentRangeLabel->setText( tr(
"Temporal navigation disabled" ) );
533 return mNavigationObject;
536 void QgsTemporalControllerWidget::settings_clicked()
538 QgsTemporalMapSettingsWidget *settingsWidget =
new QgsTemporalMapSettingsWidget(
this );
539 settingsWidget->setFrameRateValue( mNavigationObject->
framesPerSecond() );
542 connect( settingsWidget, &QgsTemporalMapSettingsWidget::frameRateChanged,
this, [ = ](
double rate )
549 connect( settingsWidget, &QgsTemporalMapSettingsWidget::temporalRangeCumulativeChanged,
this, [ = ](
bool state )
558 void QgsTemporalControllerWidget::timeSlider_valueChanged(
int value )
563 void QgsTemporalControllerWidget::startEndDateTime_changed()
565 whileBlocking( mFixedRangeStartDateTime )->setDateTime( mStartDateTime->dateTime() );
566 whileBlocking( mFixedRangeEndDateTime )->setDateTime( mEndDateTime->dateTime() );
568 updateTemporalExtent();
569 saveRangeToProject();
572 void QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed()
574 whileBlocking( mStartDateTime )->setDateTime( mFixedRangeStartDateTime->dateTime() );
575 whileBlocking( mEndDateTime )->setDateTime( mFixedRangeEndDateTime->dateTime() );
577 updateTemporalExtent();
578 saveRangeToProject();
581 void QgsTemporalControllerWidget::mRangeSetToAllLayersAction_triggered()
583 setDatesToAllLayers();
584 saveRangeToProject();
587 void QgsTemporalControllerWidget::setTimeStep(
const QgsInterval &timeStep )
592 int selectedUnit = -1;
593 double selectedValue = std::numeric_limits<double>::max();
599 int stringSize = std::numeric_limits<int>::max();
600 int precision = mStepSpinBox->decimals();
601 for (
int i = 0; i < mTimeStepsComboBox->count(); ++i )
605 QString
string = QString::number( value,
'f',
precision );
606 string.remove( QRegExp(
"0+$" ) );
607 string.remove( QRegExp(
"[.]+$" ) );
610 &&
string.size() <= stringSize
611 && value < selectedValue )
614 selectedValue = value;
615 stringSize =
string.size();
617 else if (
string !=
'0'
619 &&
string.size() < stringSize )
622 selectedValue = value ;
623 stringSize =
string.size();
629 selectedUnit = mTimeStepsComboBox->findData(
static_cast< int >( timeStep.
originalUnit() ) );
633 if ( selectedUnit >= 0 )
635 mStepSpinBox->setValue( selectedValue );
636 mTimeStepsComboBox->setCurrentIndex( selectedUnit );
639 updateFrameDuration();
642 void QgsTemporalControllerWidget::updateTimeStepInputs(
const QgsInterval &timeStep )
647 QString timeDisplayFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss" );
650 timeDisplayFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss.zzz" );
652 updateTemporalExtent();
654 mStartDateTime->setDisplayFormat( timeDisplayFormat );
655 mEndDateTime->setDisplayFormat( timeDisplayFormat );
656 mFixedRangeStartDateTime->setDisplayFormat( timeDisplayFormat );
657 mFixedRangeEndDateTime->setDisplayFormat( timeDisplayFormat );
660 if ( timeStep ==
QgsInterval( mStepSpinBox->value(),
667 mTimeStepsComboBox->setCurrentIndex( timeStep.
originalUnit() );
670 updateFrameDuration();
673 void QgsTemporalControllerWidget::mRangeSetToProjectAction_triggered()
675 setDatesToProjectTime();
676 saveRangeToProject();
679 void QgsTemporalControllerWidget::setDates(
const QgsDateTimeRange &range )
681 if ( range.begin().isValid() && range.end().isValid() )
683 whileBlocking( mStartDateTime )->setDateTime( range.begin() );
685 whileBlocking( mFixedRangeStartDateTime )->setDateTime( range.begin() );
686 whileBlocking( mFixedRangeEndDateTime )->setDateTime( range.end() );
687 updateTemporalExtent();
691 void QgsTemporalControllerWidget::setDatesToAllLayers()
693 QgsDateTimeRange range;
700 void QgsTemporalControllerWidget::setDatesToProjectTime()
702 QgsDateTimeRange range;
709 if ( !range.begin().isValid() || !range.end().isValid() )
719 void QgsTemporalControllerWidget::saveRangeToProject()
722 QStringLiteral(
"/StartDateTime" ), mStartDateTime->dateTime().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODateWithMs ) );
724 QStringLiteral(
"/EndDateTime" ), mEndDateTime->dateTime().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODateWithMs ) );
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
A representation of the interval between two datetime values.
double originalDuration() const
Returns the original interval duration.
bool isValid() const
Returns true if the interval is valid.
double seconds() const
Returns the interval duration in seconds.
QgsUnitTypes::TemporalUnit originalUnit() const
Returns the original interval temporal unit.
The QgsMapLayerModel class is a model to display layers in widgets.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
@ LayerRole
Stores pointer to the map layer itself.
virtual QgsDateTimeRange calculateTemporalExtent(QgsMapLayer *layer) const
Attempts to calculate the overall temporal extent for the specified layer, using the settings defined...
Base class for all map layer types.
void dataSourceChanged()
Emitted whenever the layer's data source has been changed.
virtual QgsMapLayerTemporalProperties * temporalProperties()
Returns the layer's temporal properties.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsDateTimeRange temporalRange() const
Returns the project's temporal range, which indicates the earliest and latest datetime ranges associa...
void setTimeStepUnit(QgsUnitTypes::TemporalUnit unit)
Sets the project's time step (length of one animation frame) unit, which is used as the default value...
void setFramesPerSecond(double rate)
Sets the project's default animation frame rate, in frames per second.
QgsUnitTypes::TemporalUnit timeStepUnit() const
Returns the project's time step (length of one animation frame) unit, which is used as the default va...
void setIsTemporalRangeCumulative(bool state)
Sets the project's temporal range as cumulative in animation settings.
void setTimeStep(double step)
Sets the project's time step (length of one animation frame), which is used as the default value when...
int readNumEntry(const QString &scope, const QString &key, int def=0, bool *ok=nullptr) const
Reads an integer from the specified scope and key.
static QgsProject * instance()
Returns the QgsProject singleton instance.
void cleared()
Emitted when the project is cleared (and additionally when an open project is cleared just before a n...
QString readEntry(const QString &scope, const QString &key, const QString &def=QString(), bool *ok=nullptr) const
Reads a string from the specified scope and key.
void readProject(const QDomDocument &)
Emitted when a project is being read.
bool writeEntry(const QString &scope, const QString &key, bool value)
Write a boolean value to the project file.
void layersAdded(const QList< QgsMapLayer * > &layers)
Emitted when one or more layers were added to the registry.
const QgsProjectTimeSettings * timeSettings() const
Returns the project's time settings, which contains the project's temporal range and other time based...
Represents a raster layer.
void updateTemporalRange(const QgsDateTimeRange &range)
Signals that a temporal range has changed and needs to be updated in all connected objects.
Implements a temporal controller based on a frame by frame navigation and animation.
void previous()
Jumps back to the previous frame.
double framesPerSecond() const
Returns the animation frame rate, in frames per second.
void setAvailableTemporalRanges(const QList< QgsDateTimeRange > &ranges)
Sets the list of all available temporal ranges which have data available.
void setFrameDuration(const QgsInterval &duration)
Sets the frame duration, which dictates the temporal length of each frame in the animation.
void playForward()
Starts the animation playing in a forward direction up till the end of all frames.
NavigationMode
Represents the current temporal navigation mode.
@ NavigationOff
Temporal navigation is disabled.
@ FixedRange
Temporal navigation relies on a fixed datetime range.
@ Animated
Temporal navigation relies on frames within a datetime range.
long long currentFrameNumber() const
Returns the current frame number.
void rewindToStart()
Rewinds the temporal navigation to start of the temporal extent.
void pause()
Pauses the temporal navigation.
void setCurrentFrameNumber(long long frame)
Sets the current animation frame number.
long long totalFrameCount() const
Returns the total number of frames for the navigation.
void skipToEnd()
Skips the temporal navigation to end of the temporal extent.
void temporalFrameDurationChanged(const QgsInterval &interval)
Emitted whenever the frameDuration interval of the controller changes.
void navigationModeChanged(NavigationMode mode)
Emitted whenever the navigation mode changes.
void setFramesPerSecond(double rate)
Sets the animation frame rate, in frames per second.
void stateChanged(AnimationState state)
Emitted whenever the animation state changes.
AnimationState
Represents the current animation state.
@ Forward
Animation is playing forward.
@ Reverse
Animation is playing in reverse.
@ Idle
Animation is paused.
bool temporalRangeCumulative() const
Returns the animation temporal range cumulative settings.
void next()
Advances to the next frame.
void setTemporalExtents(const QgsDateTimeRange &extents)
Sets the navigation temporal extents, which dictate the earliest and latest date time possible in the...
void setTemporalRangeCumulative(bool state)
Sets the animation temporal range as cumulative.
void setLooping(bool loop)
Sets whether the animation should loop after hitting the end or start frame.
void playBackward()
Starts the animation playing in a reverse direction until the beginning of the time range.
void temporalExtentsChanged(const QgsDateTimeRange &extent)
Emitted whenever the temporalExtent extent changes.
void setNavigationMode(const NavigationMode mode)
Sets the temporal navigation mode.
AnimationState animationState() const
Returns the current animation state.
NavigationMode navigationMode() const
Returns the current temporal navigation mode.
bool isActive() const
Returns true if the temporal property is active.
static QgsDateTimeRange calculateTemporalRangeForProject(QgsProject *project)
Calculates the temporal range for a project.
static QList< QgsDateTimeRange > usedTemporalRangesForProject(QgsProject *project)
Calculates all temporal ranges which are in use for a project.
static Q_INVOKABLE QString toString(QgsUnitTypes::DistanceUnit unit)
Returns a translated string representing a distance unit.
static Q_INVOKABLE double fromUnitToUnitFactor(QgsUnitTypes::DistanceUnit fromUnit, QgsUnitTypes::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
TemporalUnit
Temporal units.
@ TemporalUnknownUnit
Unknown time unit.
@ TemporalMilliseconds
Milliseconds.
@ TemporalIrregularStep
Special "irregular step" time unit, used for temporal data which uses irregular, non-real-world unit ...
@ TemporalDecades
Decades.
@ TemporalCenturies
Centuries.
@ TemporalSeconds
Seconds.
@ TemporalMinutes
Minutes.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.