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__':