mirror of
https://github.com/qgis/QGIS.git
synced 2025-11-22 00:14:55 -05:00
Add GUI to configure fixed range per band mode
This is exposed as a user editable table of raster bands with lower and upper values. Users can either populate the lower and upper values manually, or use an expression to auto fill all band values based on a qgis expression. The expression based fill allows for users to design expressions which extract useful information from band names, eg extracting the depth value from a "Band 001: depth=-5500 (meters)" style band name.
This commit is contained in:
parent
1796318afe
commit
a3f1f910cf
@ -20,6 +20,9 @@
|
||||
#include "qgsrasterlayerelevationproperties.h"
|
||||
#include "qgslinesymbol.h"
|
||||
#include "qgsfillsymbol.h"
|
||||
#include "qgsexpressionbuilderdialog.h"
|
||||
#include <QMenu>
|
||||
#include <QAction>
|
||||
|
||||
QgsRasterElevationPropertiesWidget::QgsRasterElevationPropertiesWidget( QgsRasterLayer *layer, QgsMapCanvas *canvas, QWidget *parent )
|
||||
: QgsMapLayerConfigWidget( layer, canvas, parent )
|
||||
@ -30,6 +33,7 @@ QgsRasterElevationPropertiesWidget::QgsRasterElevationPropertiesWidget( QgsRaste
|
||||
mModeComboBox->addItem( tr( "Disabled" ) );
|
||||
mModeComboBox->addItem( tr( "Represents Elevation Surface" ), QVariant::fromValue( Qgis::RasterElevationMode::RepresentsElevationSurface ) );
|
||||
mModeComboBox->addItem( tr( "Fixed Elevation Range" ), QVariant::fromValue( Qgis::RasterElevationMode::FixedElevationRange ) );
|
||||
mModeComboBox->addItem( tr( "Fixed Elevation Range Per Band" ), QVariant::fromValue( Qgis::RasterElevationMode::FixedRangePerBand ) );
|
||||
|
||||
mLimitsComboBox->addItem( tr( "Include Lower and Upper" ), QVariant::fromValue( Qgis::RangeLimits::IncludeBoth ) );
|
||||
mLimitsComboBox->addItem( tr( "Include Lower, Exclude Upper" ), QVariant::fromValue( Qgis::RangeLimits::IncludeLowerExcludeUpper ) );
|
||||
@ -53,6 +57,32 @@ QgsRasterElevationPropertiesWidget::QgsRasterElevationPropertiesWidget( QgsRaste
|
||||
mStyleComboBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "mIconSurfaceElevationFillAbove.svg" ) ), tr( "Fill Above" ), static_cast< int >( Qgis::ProfileSurfaceSymbology::FillAbove ) );
|
||||
mElevationLimitSpinBox->setClearValue( mElevationLimitSpinBox->minimum(), tr( "Not set" ) );
|
||||
|
||||
// NOTE -- this doesn't work, there's something broken in QgsStackedWidget which breaks the height calculations
|
||||
mPageFixedRangePerBand->setFixedHeight( QFontMetrics( font() ).height() * 15 );
|
||||
|
||||
mFixedRangePerBandModel = new QgsRasterBandFixedElevationRangeModel( this );
|
||||
mBandElevationTable->verticalHeader()->setVisible( false );
|
||||
mBandElevationTable->setModel( mFixedRangePerBandModel );
|
||||
QgsFixedElevationRangeDelegate *tableDelegate = new QgsFixedElevationRangeDelegate( mBandElevationTable );
|
||||
mBandElevationTable->setItemDelegateForColumn( 1, tableDelegate );
|
||||
mBandElevationTable->setItemDelegateForColumn( 2, tableDelegate );
|
||||
|
||||
QMenu *calculateFixedRangePerBandMenu = new QMenu( mCalculateFixedRangePerBandButton );
|
||||
mCalculateFixedRangePerBandButton->setMenu( calculateFixedRangePerBandMenu );
|
||||
mCalculateFixedRangePerBandButton->setPopupMode( QToolButton::InstantPopup );
|
||||
QAction *calculateLowerAction = new QAction( "Calculate Lower by Expression…", calculateFixedRangePerBandMenu );
|
||||
calculateFixedRangePerBandMenu->addAction( calculateLowerAction );
|
||||
connect( calculateLowerAction, &QAction::triggered, this, [this]
|
||||
{
|
||||
calculateRangeByExpression( false );
|
||||
} );
|
||||
QAction *calculateUpperAction = new QAction( "Calculate Upper by Expression…", calculateFixedRangePerBandMenu );
|
||||
calculateFixedRangePerBandMenu->addAction( calculateUpperAction );
|
||||
connect( calculateUpperAction, &QAction::triggered, this, [this]
|
||||
{
|
||||
calculateRangeByExpression( true );
|
||||
} );
|
||||
|
||||
syncToLayer( layer );
|
||||
|
||||
connect( mOffsetZSpinBox, qOverload<double >( &QDoubleSpinBox::valueChanged ), this, &QgsRasterElevationPropertiesWidget::onChanged );
|
||||
@ -89,6 +119,7 @@ void QgsRasterElevationPropertiesWidget::syncToLayer( QgsMapLayer *layer )
|
||||
return;
|
||||
|
||||
mBlockUpdates = true;
|
||||
|
||||
const QgsRasterLayerElevationProperties *props = qgis::down_cast< const QgsRasterLayerElevationProperties * >( mLayer->elevationProperties() );
|
||||
if ( !props->isEnabled() )
|
||||
{
|
||||
@ -107,6 +138,9 @@ void QgsRasterElevationPropertiesWidget::syncToLayer( QgsMapLayer *layer )
|
||||
case Qgis::RasterElevationMode::RepresentsElevationSurface:
|
||||
mStackedWidget->setCurrentWidget( mPageSurface );
|
||||
break;
|
||||
case Qgis::RasterElevationMode::FixedRangePerBand:
|
||||
mStackedWidget->setCurrentWidget( mPageFixedRangePerBand );
|
||||
break;
|
||||
}
|
||||
mProfileChartGroupBox->show();
|
||||
}
|
||||
@ -132,6 +166,11 @@ void QgsRasterElevationPropertiesWidget::syncToLayer( QgsMapLayer *layer )
|
||||
mFixedUpperSpinBox->clear();
|
||||
mLimitsComboBox->setCurrentIndex( mLimitsComboBox->findData( QVariant::fromValue( props->fixedRange().rangeLimits() ) ) );
|
||||
|
||||
mFixedRangePerBandModel->setLayerData( mLayer, props->fixedRangePerBand() );
|
||||
mBandElevationTable->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Stretch );
|
||||
mBandElevationTable->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
|
||||
mBandElevationTable->horizontalHeader()->setSectionResizeMode( 2, QHeaderView::Stretch );
|
||||
|
||||
mStyleComboBox->setCurrentIndex( mStyleComboBox->findData( static_cast <int >( props->profileSymbology() ) ) );
|
||||
switch ( props->profileSymbology() )
|
||||
{
|
||||
@ -184,6 +223,8 @@ void QgsRasterElevationPropertiesWidget::apply()
|
||||
|
||||
props->setFixedRange( QgsDoubleRange( fixedLower, fixedUpper, mLimitsComboBox->currentData().value< Qgis::RangeLimits >() ) );
|
||||
|
||||
props->setFixedRangePerBand( mFixedRangePerBandModel->rangeData() );
|
||||
|
||||
mLayer->trigger3DUpdate();
|
||||
}
|
||||
|
||||
@ -199,6 +240,9 @@ void QgsRasterElevationPropertiesWidget::modeChanged()
|
||||
case Qgis::RasterElevationMode::RepresentsElevationSurface:
|
||||
mStackedWidget->setCurrentWidget( mPageSurface );
|
||||
break;
|
||||
case Qgis::RasterElevationMode::FixedRangePerBand:
|
||||
mStackedWidget->setCurrentWidget( mPageFixedRangePerBand );
|
||||
break;
|
||||
}
|
||||
mProfileChartGroupBox->show();
|
||||
}
|
||||
@ -217,6 +261,39 @@ void QgsRasterElevationPropertiesWidget::onChanged()
|
||||
emit widgetChanged();
|
||||
}
|
||||
|
||||
void QgsRasterElevationPropertiesWidget::calculateRangeByExpression( bool isUpper )
|
||||
{
|
||||
QgsExpressionContext expressionContext;
|
||||
QgsExpressionContextScope *bandScope = new QgsExpressionContextScope();
|
||||
bandScope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "band" ), 1, true, false, tr( "Band number" ) ) );
|
||||
bandScope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "band_name" ), mLayer->dataProvider()->displayBandName( 1 ), true, false, tr( "Band name" ) ) );
|
||||
bandScope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "band_description" ), mLayer->dataProvider()->bandDescription( 1 ), true, false, tr( "Band description" ) ) );
|
||||
|
||||
expressionContext.appendScope( bandScope );
|
||||
expressionContext.setHighlightedVariables( { QStringLiteral( "band" ), QStringLiteral( "band_name" ), QStringLiteral( "band_description" )} );
|
||||
|
||||
QgsExpressionBuilderDialog dlg = QgsExpressionBuilderDialog( nullptr, isUpper ? mFixedRangeUpperExpression : mFixedRangeLowerExpression, this, QStringLiteral( "generic" ), expressionContext );
|
||||
if ( dlg.exec() )
|
||||
{
|
||||
if ( isUpper )
|
||||
mFixedRangeUpperExpression = dlg.expressionText();
|
||||
else
|
||||
mFixedRangeLowerExpression = dlg.expressionText();
|
||||
|
||||
QgsExpression exp( dlg.expressionText() );
|
||||
exp.prepare( &expressionContext );
|
||||
for ( int band = 1; band <= mLayer->bandCount(); ++band )
|
||||
{
|
||||
bandScope->setVariable( QStringLiteral( "band" ), band );
|
||||
bandScope->setVariable( QStringLiteral( "band_name" ), mLayer->dataProvider()->displayBandName( band ) );
|
||||
bandScope->setVariable( QStringLiteral( "band_description" ), mLayer->dataProvider()->bandDescription( band ) );
|
||||
|
||||
const QVariant res = exp.evaluate( &expressionContext );
|
||||
mFixedRangePerBandModel->setData( mFixedRangePerBandModel->index( band - 1, isUpper ? 2 : 1 ), res, Qt::EditRole );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// QgsRasterElevationPropertiesWidgetFactory
|
||||
@ -254,3 +331,228 @@ QString QgsRasterElevationPropertiesWidgetFactory::layerPropertiesPagePositionHi
|
||||
return QStringLiteral( "mOptsPage_Metadata" );
|
||||
}
|
||||
|
||||
//
|
||||
// QgsRasterBandFixedElevationRangeModel
|
||||
//
|
||||
|
||||
QgsRasterBandFixedElevationRangeModel::QgsRasterBandFixedElevationRangeModel( QObject *parent )
|
||||
: QAbstractItemModel( parent )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int QgsRasterBandFixedElevationRangeModel::columnCount( const QModelIndex & ) const
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
int QgsRasterBandFixedElevationRangeModel::rowCount( const QModelIndex &parent ) const
|
||||
{
|
||||
if ( parent.isValid() )
|
||||
return 0;
|
||||
return mBandCount;
|
||||
}
|
||||
|
||||
QModelIndex QgsRasterBandFixedElevationRangeModel::index( int row, int column, const QModelIndex &parent ) const
|
||||
{
|
||||
if ( hasIndex( row, column, parent ) )
|
||||
{
|
||||
return createIndex( row, column, row );
|
||||
}
|
||||
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
QModelIndex QgsRasterBandFixedElevationRangeModel::parent( const QModelIndex &child ) const
|
||||
{
|
||||
Q_UNUSED( child )
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
Qt::ItemFlags QgsRasterBandFixedElevationRangeModel::flags( const QModelIndex &index ) const
|
||||
{
|
||||
if ( !index.isValid() )
|
||||
return Qt::ItemFlags();
|
||||
|
||||
if ( index.row() < 0 || index.row() >= mBandCount || index.column() < 0 || index.column() >= columnCount() )
|
||||
return Qt::ItemFlags();
|
||||
|
||||
switch ( index.column() )
|
||||
{
|
||||
case 0:
|
||||
return Qt::ItemFlag::ItemIsEnabled;
|
||||
case 1:
|
||||
case 2:
|
||||
return Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsEditable | Qt::ItemFlag::ItemIsSelectable;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return Qt::ItemFlags();
|
||||
}
|
||||
|
||||
QVariant QgsRasterBandFixedElevationRangeModel::data( const QModelIndex &index, int role ) const
|
||||
{
|
||||
if ( !index.isValid() )
|
||||
return QVariant();
|
||||
|
||||
if ( index.row() < 0 || index.row() >= mBandCount || index.column() < 0 || index.column() >= columnCount() )
|
||||
return QVariant();
|
||||
|
||||
const int band = index.row() + 1;
|
||||
const QgsDoubleRange range = mRanges.value( band );
|
||||
|
||||
switch ( role )
|
||||
{
|
||||
case Qt::DisplayRole:
|
||||
case Qt::EditRole:
|
||||
case Qt::ToolTipRole:
|
||||
{
|
||||
switch ( index.column() )
|
||||
{
|
||||
case 0:
|
||||
return mBandNames.value( band, QString::number( band ) );
|
||||
|
||||
case 1:
|
||||
return range.lower() > std::numeric_limits< double >::lowest() ? range.lower() : QVariant();
|
||||
|
||||
case 2:
|
||||
return range.upper() < std::numeric_limits< double >::max() ? range.upper() : QVariant();
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Qt::TextAlignmentRole:
|
||||
{
|
||||
switch ( index.column() )
|
||||
{
|
||||
case 0:
|
||||
return static_cast<Qt::Alignment::Int>( Qt::AlignLeft | Qt::AlignVCenter );
|
||||
|
||||
case 1:
|
||||
case 2:
|
||||
return static_cast<Qt::Alignment::Int>( Qt::AlignRight | Qt::AlignVCenter );
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QVariant QgsRasterBandFixedElevationRangeModel::headerData( int section, Qt::Orientation orientation, int role ) const
|
||||
{
|
||||
if ( role == Qt::DisplayRole && orientation == Qt::Horizontal )
|
||||
{
|
||||
switch ( section )
|
||||
{
|
||||
case 0:
|
||||
return tr( "Band" );
|
||||
case 1:
|
||||
return tr( "Lower" );
|
||||
case 2:
|
||||
return tr( "Upper" );
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return QAbstractItemModel::headerData( section, orientation, role );
|
||||
}
|
||||
|
||||
bool QgsRasterBandFixedElevationRangeModel::setData( const QModelIndex &index, const QVariant &value, int role )
|
||||
{
|
||||
if ( !index.isValid() )
|
||||
return false;
|
||||
|
||||
if ( index.row() > mBandCount || index.row() < 0 )
|
||||
return false;
|
||||
|
||||
const int band = index.row() + 1;
|
||||
const QgsDoubleRange range = mRanges.value( band );
|
||||
|
||||
switch ( role )
|
||||
{
|
||||
case Qt::EditRole:
|
||||
{
|
||||
bool ok = false;
|
||||
double newValue = value.toDouble( &ok );
|
||||
if ( !ok )
|
||||
return false;
|
||||
|
||||
switch ( index.column() )
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
mRanges[band] = QgsDoubleRange( newValue, range.upper(), range.includeLower(), range.includeUpper() );
|
||||
emit dataChanged( index, index, QVector<int>() << role );
|
||||
break;
|
||||
}
|
||||
|
||||
case 2:
|
||||
mRanges[band] = QgsDoubleRange( range.lower(), newValue, range.includeLower(), range.includeUpper() );
|
||||
emit dataChanged( index, index, QVector<int>() << role );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void QgsRasterBandFixedElevationRangeModel::setLayerData( QgsRasterLayer *layer, const QMap<int, QgsDoubleRange> &ranges )
|
||||
{
|
||||
beginResetModel();
|
||||
|
||||
mBandCount = layer->bandCount();
|
||||
mRanges = ranges;
|
||||
|
||||
mBandNames.clear();
|
||||
for ( int band = 1; band <= mBandCount; ++band )
|
||||
{
|
||||
mBandNames[band] = layer->dataProvider()->displayBandName( band );
|
||||
}
|
||||
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
//
|
||||
// QgsFixedElevationRangeDelegate
|
||||
//
|
||||
|
||||
QgsFixedElevationRangeDelegate::QgsFixedElevationRangeDelegate( QObject *parent )
|
||||
: QStyledItemDelegate( parent )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QWidget *QgsFixedElevationRangeDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &, const QModelIndex & ) const
|
||||
{
|
||||
QgsDoubleSpinBox *spin = new QgsDoubleSpinBox( parent );
|
||||
spin->setDecimals( 4 );
|
||||
spin->setMinimum( -9999999998.0 );
|
||||
spin->setMaximum( 9999999999.0 );
|
||||
spin->setShowClearButton( false );
|
||||
return spin;
|
||||
}
|
||||
|
||||
void QgsFixedElevationRangeDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
|
||||
{
|
||||
if ( QgsDoubleSpinBox *spin = qobject_cast< QgsDoubleSpinBox * >( editor ) )
|
||||
{
|
||||
model->setData( index, spin->value() );
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,11 +18,53 @@
|
||||
|
||||
#include "qgsmaplayerconfigwidget.h"
|
||||
#include "qgsmaplayerconfigwidgetfactory.h"
|
||||
|
||||
#include "ui_qgsrasterelevationpropertieswidgetbase.h"
|
||||
|
||||
#include <QAbstractItemModel>
|
||||
#include <QStyledItemDelegate>
|
||||
|
||||
class QgsRasterLayer;
|
||||
|
||||
class QgsRasterBandFixedElevationRangeModel : public QAbstractItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
QgsRasterBandFixedElevationRangeModel( QObject *parent );
|
||||
int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
|
||||
int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
|
||||
QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
|
||||
QModelIndex parent( const QModelIndex &child ) const override;
|
||||
Qt::ItemFlags flags( const QModelIndex &index ) const override;
|
||||
QVariant data( const QModelIndex &index, int role ) const override;
|
||||
QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
|
||||
bool setData( const QModelIndex &index, const QVariant &value, int role ) override;
|
||||
|
||||
void setLayerData( QgsRasterLayer *layer, const QMap<int, QgsDoubleRange > &ranges );
|
||||
QMap<int, QgsDoubleRange > rangeData() const { return mRanges; }
|
||||
|
||||
private:
|
||||
|
||||
int mBandCount = 0;
|
||||
QMap<int, QString > mBandNames;
|
||||
QMap<int, QgsDoubleRange > mRanges;
|
||||
};
|
||||
|
||||
class QgsFixedElevationRangeDelegate : public QStyledItemDelegate
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
QgsFixedElevationRangeDelegate( QObject *parent );
|
||||
|
||||
protected:
|
||||
QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem & /*option*/, const QModelIndex &index ) const override;
|
||||
void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const override;
|
||||
|
||||
};
|
||||
|
||||
class QgsRasterElevationPropertiesWidget : public QgsMapLayerConfigWidget, private Ui::QgsRasterElevationPropertiesWidgetBase
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -39,11 +81,15 @@ class QgsRasterElevationPropertiesWidget : public QgsMapLayerConfigWidget, priva
|
||||
|
||||
void modeChanged();
|
||||
void onChanged();
|
||||
void calculateRangeByExpression( bool isUpper );
|
||||
|
||||
private:
|
||||
|
||||
QgsRasterLayer *mLayer = nullptr;
|
||||
bool mBlockUpdates = false;
|
||||
QgsRasterBandFixedElevationRangeModel *mFixedRangePerBandModel = nullptr;
|
||||
QString mFixedRangeLowerExpression = QStringLiteral( "@band" );
|
||||
QString mFixedRangeUpperExpression = QStringLiteral( "@band" );
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -44,7 +44,7 @@
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>2</number>
|
||||
<number>3</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="mPageDisabled">
|
||||
<property name="sizePolicy">
|
||||
@ -230,6 +230,84 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="mPageFixedRangePerBand">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_6">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="1" column="0">
|
||||
<widget class="QTableView" name="mBandElevationTable"/>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p><span style=" font-weight:600;">Each band in the raster layer is associated with a fixed elevation range.</span></p><p>This mode can be used when a layer has elevation data exposed through different raster bands.</p></body></html></string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="mCalculateFixedRangePerBandButton">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../images/images.qrc">
|
||||
<normaloff>:/images/themes/default/mIconExpression.svg</normaloff>:/images/themes/default/mIconExpression.svg</iconset>
|
||||
</property>
|
||||
<property name="popupMode">
|
||||
<enum>QToolButton::MenuButtonPopup</enum>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
@ -404,6 +482,8 @@
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<resources>
|
||||
<include location="../../../images/images.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user