diff --git a/python/core/auto_generated/qgsfieldmodel.sip.in b/python/core/auto_generated/qgsfieldmodel.sip.in index 497ae7bdeb4..256b7882d03 100644 --- a/python/core/auto_generated/qgsfieldmodel.sip.in +++ b/python/core/auto_generated/qgsfieldmodel.sip.in @@ -128,12 +128,20 @@ Returns the layer associated with the model. virtual QVariant data( const QModelIndex &index, int role ) const; - static QString fieldToolTip( const QgsField &field, const QString &expression = QString() ); + static QString fieldToolTip( const QgsField &field ); %Docstring Returns a HTML formatted tooltip string for a ``field``, containing details like the field name, alias and type. .. versionadded:: 3.0 +%End + + static QString fieldToolTipExtended( const QgsField &field, const QgsVectorLayer *layer ); +%Docstring +Returns a HTML formatted tooltip string for a ``field``, containing details +like the field name, alias, type and expression. + +.. versionadded:: 3.14 %End void setFields( const QgsFields &fields ); diff --git a/src/app/qgsidentifyresultsdialog.cpp b/src/app/qgsidentifyresultsdialog.cpp index 51266aef415..0a9aece3d02 100644 --- a/src/app/qgsidentifyresultsdialog.cpp +++ b/src/app/qgsidentifyresultsdialog.cpp @@ -626,11 +626,8 @@ void QgsIdentifyResultsDialog::addFeature( QgsVectorLayer *vlayer, const QgsFeat QgsTreeWidgetItem *attrItem = new QgsTreeWidgetItem( QStringList() << QString::number( i ) << value ); featItem->addChild( attrItem ); - QString expressionString = fields.fieldOrigin( i ) == QgsFields::OriginExpression - ? vlayer->expressionField( i ) - : QString(); attrItem->setData( 0, Qt::DisplayRole, vlayer->attributeDisplayName( i ) ); - attrItem->setToolTip( 0, QgsFieldModel::fieldToolTip( fields.at( i ), expressionString ) ); + attrItem->setToolTip( 0, QgsFieldModel::fieldToolTipExtended( fields.at( i ), vlayer ) ); attrItem->setData( 0, Qt::UserRole, fields.at( i ).name() ); attrItem->setData( 0, Qt::UserRole + 1, i ); diff --git a/src/core/qgsfieldmodel.cpp b/src/core/qgsfieldmodel.cpp index fb5e9de4506..37d423600eb 100644 --- a/src/core/qgsfieldmodel.cpp +++ b/src/core/qgsfieldmodel.cpp @@ -464,7 +464,7 @@ QVariant QgsFieldModel::data( const QModelIndex &index, int role ) const } } -QString QgsFieldModel::fieldToolTip( const QgsField &field, const QString &expression ) +QString QgsFieldModel::fieldToolTip( const QgsField &field ) { QString toolTip; if ( !field.alias().isEmpty() ) @@ -485,9 +485,25 @@ QString QgsFieldModel::fieldToolTip( const QgsField &field, const QString &expre toolTip += QStringLiteral( "
%1" ).arg( comment ); } - if ( ! expression.isEmpty() ) + return toolTip; +} + +QString QgsFieldModel::fieldToolTipExtended( const QgsField &field, const QgsVectorLayer *layer ) +{ + QString toolTip = QgsFieldModel::fieldToolTip( field ); + const QgsFields fields = layer->fields(); + int fieldIdx = fields.indexOf( field.name() ); + + if ( fieldIdx < 0 ) + return QString(); + + QString expressionString = fields.fieldOrigin( fieldIdx ) == QgsFields::OriginExpression + ? layer->expressionField( fieldIdx ) + : QString(); + + if ( !expressionString.isEmpty() ) { - toolTip += QStringLiteral( "
%3" ).arg( expression ); + toolTip += QStringLiteral( "
%3" ).arg( expressionString ); } return toolTip; diff --git a/src/core/qgsfieldmodel.h b/src/core/qgsfieldmodel.h index 34e702b71b4..cab1bea0b14 100644 --- a/src/core/qgsfieldmodel.h +++ b/src/core/qgsfieldmodel.h @@ -135,7 +135,14 @@ class CORE_EXPORT QgsFieldModel : public QAbstractItemModel * like the field name, alias and type. * \since QGIS 3.0 */ - static QString fieldToolTip( const QgsField &field, const QString &expression = QString() ); + static QString fieldToolTip( const QgsField &field ); + + /** + * Returns a HTML formatted tooltip string for a \a field, containing details + * like the field name, alias, type and expression. + * \since QGIS 3.14 + */ + static QString fieldToolTipExtended( const QgsField &field, const QgsVectorLayer *layer ); /** * Manually sets the \a fields to use for the model. diff --git a/src/gui/attributetable/qgsattributetablemodel.cpp b/src/gui/attributetable/qgsattributetablemodel.cpp index 409e5e950a7..13413b8c434 100644 --- a/src/gui/attributetable/qgsattributetablemodel.cpp +++ b/src/gui/attributetable/qgsattributetablemodel.cpp @@ -624,10 +624,7 @@ QVariant QgsAttributeTableModel::headerData( int section, Qt::Orientation orient else { const QgsField field = layer()->fields().at( mAttributes.at( section ) ); - QString expressionString = layer()->fields().fieldOrigin( mAttributes.at( section ) ) == QgsFields::OriginExpression - ? layer()->expressionField( mAttributes.at( section ) ) - : QString(); - return QgsFieldModel::fieldToolTip( field, expressionString ); + return QgsFieldModel::fieldToolTipExtended( field, layer() ); } } else diff --git a/src/gui/qgsattributeform.cpp b/src/gui/qgsattributeform.cpp index ddc3f3fdde0..79a9826ce4c 100644 --- a/src/gui/qgsattributeform.cpp +++ b/src/gui/qgsattributeform.cpp @@ -1506,11 +1506,8 @@ void QgsAttributeForm::init() bool labelOnTop = mLayer->editFormConfig().labelOnTop( idx ); // This will also create the widget - QString expressionString = fields.fieldOrigin( idx ) == QgsFields::OriginExpression - ? mLayer->expressionField( idx ) - : QString(); QLabel *l = new QLabel( labelText ); - l->setToolTip( QgsFieldModel::fieldToolTip( field, expressionString ) ); + l->setToolTip( QgsFieldModel::fieldToolTipExtended( field, mLayer ) ); QSvgWidget *i = new QSvgWidget(); i->setFixedSize( 18, 18 ); diff --git a/tests/src/python/test_qgsfieldmodel.py b/tests/src/python/test_qgsfieldmodel.py index 703c4468452..2c976d48e41 100644 --- a/tests/src/python/test_qgsfieldmodel.py +++ b/tests/src/python/test_qgsfieldmodel.py @@ -360,12 +360,19 @@ class TestQgsFieldModel(unittest.TestCase): self.assertEqual(QgsFieldModel.fieldToolTip(f), "my_real
real(8, 3) NULL") f.setComment('Comment text') self.assertEqual(QgsFieldModel.fieldToolTip(f), "my_real
real(8, 3) NULL
Comment text") - self.assertEqual(QgsFieldModel.fieldToolTip(f, '1+1'), "my_real
real(8, 3) NULL
Comment text
1+1") + + def testFieldTooltipExtended(self): + layer = QgsVectorLayer("Point?", "tooltip", "memory") + f = QgsField('my_real', QVariant.Double, 'real', 8, 3, 'Comment text') + layer.addExpressionField('1+1', f) + layer.updateFields() + self.assertEqual(QgsFieldModel.fieldToolTipExtended(QgsField('my_string', QVariant.String, 'string'), layer), '') + self.assertEqual(QgsFieldModel.fieldToolTipExtended(f, layer), "my_real
real(8, 3) NULL
Comment text
1+1") f.setAlias('my alias') constraints = f.constraints() constraints.setConstraint(QgsFieldConstraints.ConstraintUnique) f.setConstraints(constraints) - self.assertEqual(QgsFieldModel.fieldToolTip(f, '1+1'), "my alias (my_real)
real(8, 3) NULL UNIQUE
Comment text
1+1") + self.assertEqual(QgsFieldModel.fieldToolTipExtended(f, layer), "my alias (my_real)
real(8, 3) NULL UNIQUE
Comment text
1+1") if __name__ == '__main__':