16#include <QIntValidator> 
   21#include <QRegularExpression> 
   25#include "moc_qgsrastertransparencywidget.cpp" 
   41  , TRSTRING_NOT_SET( tr( 
"Not Set" ) )
 
   42  , mRasterLayer( layer )
 
   43  , mMapCanvas( canvas )
 
   46  connect( pbnAddValuesFromDisplay, &QToolButton::clicked, 
this, &QgsRasterTransparencyWidget::pbnAddValuesFromDisplay_clicked );
 
   47  connect( pbnAddValuesManually, &QToolButton::clicked, 
this, &QgsRasterTransparencyWidget::pbnAddValuesManually_clicked );
 
   48  connect( pbnDefaultValues, &QToolButton::clicked, 
this, &QgsRasterTransparencyWidget::pbnDefaultValues_clicked );
 
   49  connect( pbnExportTransparentPixelValues, &QToolButton::clicked, 
this, &QgsRasterTransparencyWidget::pbnExportTransparentPixelValues_clicked );
 
   50  connect( pbnImportTransparentPixelValues, &QToolButton::clicked, 
this, &QgsRasterTransparencyWidget::pbnImportTransparentPixelValues_clicked );
 
   51  connect( pbnRemoveSelectedRow, &QToolButton::clicked, 
this, &QgsRasterTransparencyWidget::pbnRemoveSelectedRow_clicked );
 
   53  mNodataColorButton->setShowNoColor( 
true );
 
   54  mNodataColorButton->setColorDialogTitle( tr( 
"Select NoData Color" ) );
 
   61  leNoDataValue->setValidator( 
new QgsDoubleValidator( std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max(), 
this ) );
 
   64  mPixelSelectorTool = 
nullptr;
 
   72    pbnAddValuesFromDisplay->setEnabled( 
false );
 
 
   89    expContext = canvas->createExpressionContext();
 
 
  121      gboxNoDataValue->setEnabled( 
false );
 
  122      gboxCustomTransparency->setEnabled( 
false );
 
  125    cboxTransparencyBand->setShowNotSetOption( 
true, tr( 
"None" ) );
 
  126    cboxTransparencyBand->setLayer( mRasterLayer );
 
  133      lblSrcNoDataValue->setText( tr( 
"not defined" ) );
 
  140    mSrcNoDataValueCheckBox->setEnabled( enableSrcNoData );
 
  141    lblSrcNoDataValue->setEnabled( enableSrcNoData );
 
  147      mNodataColorButton->setColor( renderer->
nodataColor() );
 
  149      mNodataColorButton->setToNull();
 
  151    mOpacityWidget->setOpacity( renderer->
opacity() );
 
  153    cboxTransparencyBand->setBand( renderer->
alphaBand() );
 
  159    QgsDebugMsgLevel( QStringLiteral( 
"noDataRangeList.size = %1" ).arg( noDataRangeList.size() ), 2 );
 
  160    if ( !noDataRangeList.isEmpty() )
 
  163      leNoDataValue->setText( QLocale().toString( v, 
'g', 20 ) );
 
  167      leNoDataValue->setText( QString() );
 
  172    leNoDataValue->setText( QString() );
 
  178  populateTransparencyTable( mRasterLayer->
renderer() );
 
 
  181void QgsRasterTransparencyWidget::transparencyCellTextEdited( 
const QString &text )
 
  186  switch ( mCurrentMode )
 
  188    case Mode::SingleBand:
 
  190      QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
 
  195      for ( 
int r = 0; r < tableTransparency->rowCount(); r++ )
 
  197        for ( 
int c = 0; 
c < tableTransparency->columnCount(); 
c++ )
 
  199          if ( tableTransparency->cellWidget( r, 
c ) == sender() )
 
  209      QgsDebugMsgLevel( QStringLiteral( 
"row = %1 column =%2" ).arg( row ).arg( column ), 2 );
 
  211      if ( column == 
static_cast<int>( SingleBandTableColumns::From ) )
 
  213        QLineEdit *toLineEdit = 
dynamic_cast<QLineEdit *
>( tableTransparency->cellWidget( row, 
static_cast<int>( SingleBandTableColumns::To ) ) );
 
  217        const bool toChanged = mTransparencyToEdited.value( row );
 
  221          toLineEdit->setText( lineEdit->text() );
 
  224      else if ( column == 
static_cast<int>( SingleBandTableColumns::To ) )
 
  226        setTransparencyToEdited( row );
 
  238void QgsRasterTransparencyWidget::pbnAddValuesFromDisplay_clicked()
 
  240  if ( mMapCanvas && mPixelSelectorTool )
 
  246void QgsRasterTransparencyWidget::pbnAddValuesManually_clicked()
 
  254  tableTransparency->insertRow( tableTransparency->rowCount() );
 
  257  switch ( mCurrentMode )
 
  259    case Mode::SingleBand:
 
  268  for ( 
int i = 0; i < n; i++ )
 
  270    setTransparencyCell( tableTransparency->rowCount() - 1, i, std::numeric_limits<double>::quiet_NaN() );
 
  273  switch ( mCurrentMode )
 
  275    case Mode::SingleBand:
 
  276      setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( SingleBandTableColumns::Opacity ), 100 );
 
  280      setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Opacity ), 100 );
 
  288void QgsRasterTransparencyWidget::pbnDefaultValues_clicked()
 
  296  const int nBands = r->
usesBands().size();
 
  298  setupTransparencyTable( nBands );
 
  304void QgsRasterTransparencyWidget::pbnExportTransparentPixelValues_clicked()
 
  307  const QString myLastDir = myQSettings.
value( QStringLiteral( 
"lastRasterFileFilterDir" ), QDir::homePath() ).toString();
 
  308  QString myFileName = QFileDialog::getSaveFileName( 
this, tr( 
"Save Pixel Values as File" ), myLastDir, tr( 
"Textfile" ) + 
" (*.txt)" );
 
  309  if ( !myFileName.isEmpty() )
 
  311    if ( !myFileName.endsWith( QLatin1String( 
".txt" ), Qt::CaseInsensitive ) )
 
  313      myFileName = myFileName + 
".txt";
 
  316    QFile myOutputFile( myFileName );
 
  317    if ( myOutputFile.open( QFile::WriteOnly | QIODevice::Truncate ) )
 
  319      QTextStream myOutputStream( &myOutputFile );
 
  320      myOutputStream << 
"# " << tr( 
"QGIS Generated Transparent Pixel Value Export File" ) << 
'\n';
 
  321      switch ( mCurrentMode )
 
  325          myOutputStream << 
"#\n#\n# " << tr( 
"Red" ) << 
"\t" << tr( 
"Green" ) << 
"\t" << tr( 
"Blue" ) << 
"\t" << tr( 
"Percent Transparent" );
 
  326          for ( 
int myTableRunner = 0; myTableRunner < tableTransparency->rowCount(); myTableRunner++ )
 
  328            myOutputStream << 
'\n' 
  329                           << QString::number( transparencyCellValue( myTableRunner, 
static_cast<int>( RgbBandTableColumns::Red ) ) ) << 
"\t" 
  330                           << QString::number( transparencyCellValue( myTableRunner, 
static_cast<int>( RgbBandTableColumns::Green ) ) ) << 
"\t" 
  331                           << QString::number( transparencyCellValue( myTableRunner, 
static_cast<int>( RgbBandTableColumns::Blue ) ) ) << 
"\t" 
  332                           << QString::number( transparencyCellValue( myTableRunner, 
static_cast<int>( RgbBandTableColumns::Opacity ) ) );
 
  336        case Mode::SingleBand:
 
  338          myOutputStream << 
"#\n#\n# " << tr( 
"Value" ) << 
"\t" << tr( 
"Percent Transparent" );
 
  340          for ( 
int myTableRunner = 0; myTableRunner < tableTransparency->rowCount(); myTableRunner++ )
 
  342            myOutputStream << 
'\n' 
  343                           << QString::number( transparencyCellValue( myTableRunner, 
static_cast<int>( SingleBandTableColumns::From ) ) ) << 
"\t" 
  344                           << QString::number( transparencyCellValue( myTableRunner, 
static_cast<int>( SingleBandTableColumns::To ) ) ) << 
"\t" 
  345                           << QString::number( transparencyCellValue( myTableRunner, 
static_cast<int>( SingleBandTableColumns::Opacity ) ) );
 
  353      QMessageBox::warning( 
this, tr( 
"Save Pixel Values as File" ), tr( 
"Write access denied. Adjust the file permissions and try again.\n\n" ) );
 
  358void QgsRasterTransparencyWidget::pbnImportTransparentPixelValues_clicked()
 
  360  int myLineCounter = 0;
 
  361  bool myImportError = 
false;
 
  364  const QString myLastDir = myQSettings.
value( QStringLiteral( 
"lastRasterFileFilterDir" ), QDir::homePath() ).toString();
 
  365  const QString myFileName = QFileDialog::getOpenFileName( 
this, tr( 
"Load Pixel Values from File" ), myLastDir, tr( 
"Textfile" ) + 
" (*.txt)" );
 
  366  QFile myInputFile( myFileName );
 
  368  const thread_local QRegularExpression sRxWhitespace( 
"\\s+" );
 
  370  if ( myInputFile.open( QFile::ReadOnly ) )
 
  372    QTextStream myInputStream( &myInputFile );
 
  374    switch ( mCurrentMode )
 
  378        for ( 
int myTableRunner = tableTransparency->rowCount() - 1; myTableRunner >= 0; myTableRunner-- )
 
  380          tableTransparency->removeRow( myTableRunner );
 
  383        while ( !myInputStream.atEnd() )
 
  386          myInputLine = myInputStream.readLine();
 
  387          if ( !myInputLine.isEmpty() )
 
  389            if ( !myInputLine.simplified().startsWith( 
'#' ) )
 
  391              QStringList myTokens = myInputLine.split( sRxWhitespace, Qt::SkipEmptyParts );
 
  392              if ( myTokens.count() != 4 )
 
  394                myImportError = 
true;
 
  395                myBadLines = myBadLines + QString::number( myLineCounter ) + 
":\t[" + myInputLine + 
"]\n";
 
  399                tableTransparency->insertRow( tableTransparency->rowCount() );
 
  400                setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Red ), myTokens[0].toDouble() );
 
  401                setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Green ), myTokens[1].toDouble() );
 
  402                setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Blue ), myTokens[2].toDouble() );
 
  403                setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Tolerance ), 0 );
 
  404                setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Opacity ), myTokens[3].toDouble() );
 
  411      case Mode::SingleBand:
 
  413        for ( 
int myTableRunner = tableTransparency->rowCount() - 1; myTableRunner >= 0; myTableRunner-- )
 
  415          tableTransparency->removeRow( myTableRunner );
 
  418        while ( !myInputStream.atEnd() )
 
  421          myInputLine = myInputStream.readLine();
 
  422          if ( !myInputLine.isEmpty() )
 
  424            if ( !myInputLine.simplified().startsWith( 
'#' ) )
 
  426              QStringList myTokens = myInputLine.split( sRxWhitespace, Qt::SkipEmptyParts );
 
  427              if ( myTokens.count() != 3 && myTokens.count() != 2 ) 
 
  429                myImportError = 
true;
 
  430                myBadLines = myBadLines + QString::number( myLineCounter ) + 
":\t[" + myInputLine + 
"]\n";
 
  434                if ( myTokens.count() == 2 )
 
  436                  myTokens.insert( 1, myTokens[0] ); 
 
  438                tableTransparency->insertRow( tableTransparency->rowCount() );
 
  440                setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( SingleBandTableColumns::From ), myTokens[0].toDouble() );
 
  441                setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( SingleBandTableColumns::To ), myTokens[1].toDouble() );
 
  442                setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( SingleBandTableColumns::Opacity ), myTokens[2].toDouble() );
 
  453      QMessageBox::warning( 
this, tr( 
"Load Pixel Values from File" ), tr( 
"The following lines contained errors\n\n%1" ).arg( myBadLines ) );
 
  456  else if ( !myFileName.isEmpty() )
 
  458    QMessageBox::warning( 
this, tr( 
"Load Pixel Values from File" ), tr( 
"Read access denied. Adjust the file permissions and try again.\n\n" ) );
 
  465void QgsRasterTransparencyWidget::pbnRemoveSelectedRow_clicked()
 
  467  if ( 0 < tableTransparency->rowCount() )
 
  469    tableTransparency->removeRow( tableTransparency->currentRow() );
 
  485  if ( !leNoDataValue->text().isEmpty() )
 
  487    bool myDoubleOk = 
false;
 
  491      const QgsRasterRange myNoDataRange( myNoDataValue, myNoDataValue );
 
  492      myNoDataRangeList << myNoDataRange;
 
  497    for ( 
int bandNo = 1; bandNo <= provider->
bandCount(); bandNo++ )
 
 
  507  if ( rasterRenderer )
 
  509    rasterRenderer->
setAlphaBand( cboxTransparencyBand->currentBand() );
 
  514    switch ( mCurrentMode )
 
  518        QVector<QgsRasterTransparency::TransparentThreeValuePixel> myTransparentThreeValuePixelList;
 
  519        myTransparentThreeValuePixelList.reserve( tableTransparency->rowCount() );
 
  520        for ( 
int myListRunner = 0; myListRunner < tableTransparency->rowCount(); myListRunner++ )
 
  522          const double red = transparencyCellValue( myListRunner, 
static_cast<int>( RgbBandTableColumns::Red ) );
 
  523          const double green = transparencyCellValue( myListRunner, 
static_cast<int>( RgbBandTableColumns::Green ) );
 
  524          const double blue = transparencyCellValue( myListRunner, 
static_cast<int>( RgbBandTableColumns::Blue ) );
 
  525          const double opacity = 1.0 - transparencyCellValue( myListRunner, 
static_cast<int>( RgbBandTableColumns::Opacity ) ) / 100.0;
 
  526          const double tolerance = transparencyCellValue( myListRunner, 
static_cast<int>( RgbBandTableColumns::Tolerance ) );
 
  527          myTransparentThreeValuePixelList.append(
 
  534      case Mode::SingleBand:
 
  536        QVector<QgsRasterTransparency::TransparentSingleValuePixel> myTransparentSingleValuePixelList;
 
  537        myTransparentSingleValuePixelList.reserve( tableTransparency->rowCount() );
 
  538        for ( 
int myListRunner = 0; myListRunner < tableTransparency->rowCount(); myListRunner++ )
 
  540          const double min = transparencyCellValue( myListRunner, 
static_cast<int>( SingleBandTableColumns::From ) );
 
  541          const double max = transparencyCellValue( myListRunner, 
static_cast<int>( SingleBandTableColumns::To ) );
 
  542          const double opacity = 1.0 - transparencyCellValue( myListRunner, 
static_cast<int>( SingleBandTableColumns::Opacity ) ) / 100.0;
 
  544          myTransparentSingleValuePixelList.append(
 
  556    rasterRenderer->
setOpacity( mOpacityWidget->opacity() );
 
 
  562  button->blockSignals( 
true );
 
  566  button->blockSignals( 
false );
 
 
  571  const auto propertyOverrideButtons { findChildren<QgsPropertyOverrideButton *>() };
 
 
  590void QgsRasterTransparencyWidget::updateProperty()
 
  598void QgsRasterTransparencyWidget::pixelSelected( 
const QgsPointXY &canvasPoint )
 
  607  if ( mMapCanvas && mPixelSelectorTool && mRasterLayer->
dataProvider() )
 
  616    const int myWidth = 
static_cast<int>( mMapCanvas->
extent().
width() / mapUnitsPerPixel );
 
  617    const int myHeight = 
static_cast<int>( mMapCanvas->
extent().
height() / mapUnitsPerPixel );
 
  621    const QList<int> bands = renderer->
usesBands();
 
  623    QList<double> values;
 
  624    for ( 
int i = 0; i < bands.size(); ++i )
 
  626      const int bandNo = bands.value( i );
 
  627      if ( myPixelMap.count( bandNo ) == 1 )
 
  633        const double value = myPixelMap.value( bandNo ).toDouble();
 
  634        QgsDebugMsgLevel( QStringLiteral( 
"value = %1" ).arg( value, 0, 
'g', 17 ), 2 );
 
  635        values.append( value );
 
  639    tableTransparency->insertRow( tableTransparency->rowCount() );
 
  641    switch ( mCurrentMode )
 
  643      case Mode::SingleBand:
 
  644        setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( SingleBandTableColumns::From ), values.value( 0 ) );
 
  645        setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( SingleBandTableColumns::To ), values.value( 0 ) );
 
  646        setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( SingleBandTableColumns::Opacity ), 100 );
 
  649        setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Red ), values.value( 0 ) );
 
  650        setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Green ), values.value( 1 ) );
 
  651        setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Blue ), values.value( 2 ) );
 
  652        setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Tolerance ), 0 );
 
  653        setTransparencyCell( tableTransparency->rowCount() - 1, 
static_cast<int>( RgbBandTableColumns::Opacity ), 100 );
 
  662void QgsRasterTransparencyWidget::populateTransparencyTable( 
QgsRasterRenderer *renderer )
 
  674  const int nBands = renderer->
usesBands().size();
 
  675  setupTransparencyTable( nBands );
 
  678  if ( !rasterTransparency )
 
  683  switch ( mCurrentMode )
 
  685    case Mode::SingleBand:
 
  688      for ( 
int i = 0; i < pixelList.size(); ++i )
 
  690        tableTransparency->insertRow( i );
 
  691        setTransparencyCell( i, 
static_cast<int>( SingleBandTableColumns::From ), pixelList[i].min );
 
  692        setTransparencyCell( i, 
static_cast<int>( SingleBandTableColumns::To ), pixelList[i].max );
 
  693        setTransparencyCell( i, 
static_cast<int>( SingleBandTableColumns::Opacity ), 100 * ( 1 - pixelList[i].opacity ) );
 
  695        if ( pixelList[i].min != pixelList[i].max )
 
  697          setTransparencyToEdited( i );
 
  705      for ( 
int i = 0; i < pixelList.size(); ++i )
 
  707        tableTransparency->insertRow( i );
 
  708        setTransparencyCell( i, 
static_cast<int>( RgbBandTableColumns::Red ), pixelList[i].red );
 
  709        setTransparencyCell( i, 
static_cast<int>( RgbBandTableColumns::Green ), pixelList[i].green );
 
  710        setTransparencyCell( i, 
static_cast<int>( RgbBandTableColumns::Blue ), pixelList[i].blue );
 
  711        setTransparencyCell( i, 
static_cast<int>( RgbBandTableColumns::Opacity ), 100 * ( 1 - pixelList[i].opacity ) );
 
  714        setTransparencyCell( i, 
static_cast<int>( RgbBandTableColumns::Tolerance ), !
qgsDoubleNear( pixelList[i].fuzzyToleranceRed, 0 ) ? pixelList[i].fuzzyToleranceRed : 0 );
 
  720  tableTransparency->resizeColumnsToContents();
 
  721  tableTransparency->resizeRowsToContents();
 
  724void QgsRasterTransparencyWidget::setupTransparencyTable( 
int nBands )
 
  726  tableTransparency->clear();
 
  727  tableTransparency->setColumnCount( 0 );
 
  728  tableTransparency->setRowCount( 0 );
 
  729  mTransparencyToEdited.clear();
 
  733    mCurrentMode = Mode::RgbBands;
 
  734    tableTransparency->setColumnCount( 
static_cast<int>( RgbBandTableColumns::ColumnCount ) );
 
  735    tableTransparency->setHorizontalHeaderItem( 
static_cast<int>( RgbBandTableColumns::Red ), 
new QTableWidgetItem( tr( 
"Red" ) ) );
 
  736    tableTransparency->setHorizontalHeaderItem( 
static_cast<int>( RgbBandTableColumns::Green ), 
new QTableWidgetItem( tr( 
"Green" ) ) );
 
  737    tableTransparency->setHorizontalHeaderItem( 
static_cast<int>( RgbBandTableColumns::Blue ), 
new QTableWidgetItem( tr( 
"Blue" ) ) );
 
  738    tableTransparency->setHorizontalHeaderItem( 
static_cast<int>( RgbBandTableColumns::Tolerance ), 
new QTableWidgetItem( tr( 
"Tolerance" ) ) );
 
  739    tableTransparency->setHorizontalHeaderItem( 
static_cast<int>( RgbBandTableColumns::Opacity ), 
new QTableWidgetItem( tr( 
"Percent Transparent" ) ) );
 
  743    mCurrentMode = Mode::SingleBand;
 
  744    tableTransparency->setColumnCount( 
static_cast<int>( SingleBandTableColumns::ColumnCount ) );
 
  745    tableTransparency->setHorizontalHeaderItem( 
static_cast<int>( SingleBandTableColumns::From ), 
new QTableWidgetItem( tr( 
"From" ) ) );
 
  746    tableTransparency->setHorizontalHeaderItem( 
static_cast<int>( SingleBandTableColumns::To ), 
new QTableWidgetItem( tr( 
"To" ) ) );
 
  747    tableTransparency->setHorizontalHeaderItem( 
static_cast<int>( SingleBandTableColumns::Opacity ), 
new QTableWidgetItem( tr( 
"Percent Transparent" ) ) );
 
  751void QgsRasterTransparencyWidget::setTransparencyCell( 
int row, 
int column, 
double value )
 
  753  QgsDebugMsgLevel( QStringLiteral( 
"value = %1" ).arg( value, 0, 
'g', 17 ), 2 );
 
  758  QLineEdit *lineEdit = 
new QLineEdit();
 
  759  lineEdit->setFrame( 
false ); 
 
  761  lineEdit->setContentsMargins( 1, 1, 1, 1 );
 
  763  if ( column == tableTransparency->columnCount() - 1 )
 
  767    lineEdit->setValidator( 
new QIntValidator( 
nullptr ) );
 
  768    lineEdit->setText( QString::number( 
static_cast<int>( value ) ) );
 
  780        if ( !std::isnan( value ) )
 
  783          valueString = QLocale().toString( v );
 
  787        lineEdit->setValidator( 
new QIntValidator( 
nullptr ) );
 
  788        if ( !std::isnan( value ) )
 
  790          valueString = QString::number( 
static_cast<int>( value ) );
 
  794    lineEdit->setText( valueString );
 
  797  tableTransparency->setCellWidget( row, column, lineEdit );
 
  798  adjustTransparencyCellWidth( row, column );
 
  800  if ( mCurrentMode == Mode::SingleBand && ( column == 
static_cast<int>( SingleBandTableColumns::From ) || column == 
static_cast<int>( SingleBandTableColumns::To ) ) )
 
  802    connect( lineEdit, &QLineEdit::textEdited, 
this, &QgsRasterTransparencyWidget::transparencyCellTextEdited );
 
  808void QgsRasterTransparencyWidget::adjustTransparencyCellWidth( 
int row, 
int column )
 
  810  QLineEdit *lineEdit = 
dynamic_cast<QLineEdit *
>( tableTransparency->cellWidget( row, column ) );
 
  814  int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
 
  815  width = std::max( width, tableTransparency->columnWidth( column ) );
 
  817  lineEdit->setFixedWidth( width );
 
  820void QgsRasterTransparencyWidget::setTransparencyToEdited( 
int row )
 
  822  if ( row >= mTransparencyToEdited.size() )
 
  824    mTransparencyToEdited.resize( row + 1 );
 
  826  mTransparencyToEdited[row] = 
true;
 
  829double QgsRasterTransparencyWidget::transparencyCellValue( 
int row, 
int column )
 
  831  QLineEdit *lineEdit = 
dynamic_cast<QLineEdit *
>( tableTransparency->cellWidget( row, column ) );
 
  832  if ( !lineEdit || lineEdit->text().isEmpty() )
 
  834    return std::numeric_limits<double>::quiet_NaN();
 
  841  return mPixelSelectorTool;
 
 
@ Float32
Thirty two bit floating point (float)
 
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
 
@ ARGB32
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32.
 
@ Float64
Sixty four bit floating point (double)
 
@ Value
Numerical pixel value.
 
A custom validator which allows entry of doubles in a locale-tolerant way.
 
static double toDouble(const QString &input, bool *ok)
Converts input string to double value.
 
Single scope for storing variables and functions for use within a QgsExpressionContext.
 
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
 
static QgsExpressionContextScope * atlasScope(const QgsLayoutAtlas *atlas)
Creates a new scope which contains variables and functions relating to a QgsLayoutAtlas.
 
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
 
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
 
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
 
Map canvas is a class for displaying all GIS data types on a canvas.
 
void unsetMapTool(QgsMapTool *mapTool)
Unset the current map tool or last non zoom tool.
 
void setMapTool(QgsMapTool *mapTool, bool clean=false)
Sets the map tool currently being used on the canvas.
 
double mapUnitsPerPixel() const
Returns the mapUnitsPerPixel (map units per pixel) for the canvas.
 
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
 
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
 
Contains configuration for rendering maps.
 
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
 
static QgsProject * instance()
Returns the QgsProject singleton instance.
 
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
 
QgsProperty property(int key) const final
Returns a matching property from the collection, if one exists.
 
void bandChanged(int band)
Emitted when the currently selected band changes.
 
static QString printValue(double value, bool localized=false)
Print double value with all necessary significant digits.
 
Base class for raster data providers.
 
virtual bool sourceHasNoDataValue(int bandNo) const
Returns true if source band has no data value.
 
virtual bool useSourceNoDataValue(int bandNo) const
Returns the source nodata value usage.
 
Qgis::DataType sourceDataType(int bandNo) const override=0
Returns source data type for the band specified by number, source data type may be shorter than dataT...
 
virtual void setUseSourceNoDataValue(int bandNo, bool use)
Sets the source nodata value usage.
 
virtual double sourceNoDataValue(int bandNo) const
Value representing no data value.
 
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
 
virtual QgsRasterIdentifyResult identify(const QgsPointXY &point, Qgis::RasterIdentifyFormat format, const QgsRectangle &boundingBox=QgsRectangle(), int width=0, int height=0, int dpi=96)
Identify raster value(s) found on the point position.
 
virtual QgsRasterRangeList userNoDataValues(int bandNo) const
Returns a list of user no data value ranges.
 
virtual void setUserNoDataValue(int bandNo, const QgsRasterRangeList &noData)
 
QMap< int, QVariant > results() const
Returns the identify results.
 
virtual int bandCount() const =0
Gets number of bands.
 
Represents a raster layer.
 
QgsRasterPipe * pipe()
Returns the raster pipe.
 
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
 
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
 
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the pipe's property collection, used for data defined overrides.
 
Property
Data definable properties.
 
@ RendererOpacity
Raster renderer global opacity.
 
static QgsPropertiesDefinition propertyDefinitions()
Returns the definitions for data defined properties available for use in raster pipes.
 
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the pipe's property collection, used for data defined overrides.
 
Represents a range of raster values between min and max, optionally including the min and max value.
 
Raster renderer pipe that applies colors to a raster.
 
QColor nodataColor() const
Returns the color to use for shading nodata pixels.
 
const QgsRasterTransparency * rasterTransparency() const
 
double opacity() const
Returns the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1....
 
virtual QList< int > usesBands() const
Returns a list of band numbers used by the renderer.
 
void setAlphaBand(int band)
 
void setOpacity(double opacity)
Sets the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1....
 
void setRasterTransparency(QgsRasterTransparency *t)
 
void setNodataColor(const QColor &color)
Sets the color to use for shading nodata pixels.
 
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
 
void setTransparentSingleValuePixelList(const QVector< QgsRasterTransparency::TransparentSingleValuePixel > &newList)
Sets the transparent single value pixel list, replacing the whole existing list.
 
QVector< QgsRasterTransparency::TransparentSingleValuePixel > transparentSingleValuePixelList() const
Returns the transparent single value pixel list.
 
void setTransparentThreeValuePixelList(const QVector< QgsRasterTransparency::TransparentThreeValuePixel > &newList)
Sets the transparent three value pixel list, replacing the whole existing list.
 
QVector< QgsRasterTransparency::TransparentThreeValuePixel > transparentThreeValuePixelList() const
Returns the transparent three value pixel list.
 
A rectangle specified with double values.
 
Stores settings for use within QGIS.
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
 
QList< QgsExpressionContextScope > additionalExpressionContextScopes() const
Returns the list of additional expression context scopes to show as available within the layer.
 
QgsMapCanvas * mapCanvas() const
Returns the map canvas associated with the widget.
 
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
 
#define QgsDebugMsgLevel(str, level)
 
QList< QgsRasterRange > QgsRasterRangeList
 
Defines the transparency for a range of single-band pixel values.
 
Defines the transparency for a RGB pixel value.