26#include <QJsonDocument> 
   37  : mName( nam ), mType( typ ), mLength( len ), mPrecision( prec ), mNumeric( num )
 
   48                    const QString &
typeName, 
int len, 
int prec, 
const QString &comment, QMetaType::Type subType )
 
 
   54                    const QString &
typeName, 
int len, 
int prec, 
const QString &comment, QVariant::Type subType )
 
 
   81  return *( other.d ) == *d;
 
 
   86  return !( *
this == other );
 
 
   96  if ( !d->alias.isEmpty() )
 
 
  104  if ( 
alias().isEmpty() )
 
  108  return QStringLiteral( 
"%1 (%2)" ).arg( 
name(), 
alias() );
 
 
  114  if ( typeStr.isEmpty() )
 
  120    typeStr += QStringLiteral( 
"(%1, %2)" ).arg( 
length() ).arg( 
precision() );
 
  122    typeStr += QStringLiteral( 
"(%1)" ).arg( 
length() );
 
  124  if ( showConstraints )
 
  127               ? QStringLiteral( 
" NOT NULL" )
 
  128               : QStringLiteral( 
" NULL" );
 
  131               ? QStringLiteral( 
" UNIQUE" )
 
 
  140  if ( d->type == QMetaType::Type::User )
 
  142    if ( d->typeName.compare( QLatin1String( 
"geometry" ), Qt::CaseInsensitive ) == 0 )
 
  144      return QObject::tr( 
"Geometry" );
 
 
  182  return d->metadata.value( property );
 
 
  192  return d->metadata.value( 
static_cast< int >( property ) );
 
 
  202  d->metadata[ 
static_cast< int >( property )] = value;
 
 
  207  d->metadata[ property ] = value;
 
 
  212  return d->type == QMetaType::Type::Double || d->type == QMetaType::Type::Int || d->type == QMetaType::Type::UInt || d->type == QMetaType::Type::LongLong || d->type == QMetaType::Type::ULongLong;
 
 
  217  return d->type == QMetaType::Type::QDate || d->type == QMetaType::Type::QTime || d->type == QMetaType::Type::QDateTime;
 
 
  272  return d->defaultValueDefinition;
 
 
  287  return d->constraints;
 
 
  323  if ( v.userType() == qMetaTypeId<QgsReferencedGeometry>() )
 
  330      QString wkt = geom.
asWkt();
 
  331      if ( wkt.length() >= 1050 )
 
  336      return formattedText;
 
  341  if ( d->type == QMetaType::Type::Double )
 
  351    if ( QLocale().decimalPoint() != 
'.' ||
 
  352         !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
 
  354      if ( d->precision > 0 )
 
  356        if ( -1 < v.toDouble() && v.toDouble() < 1 )
 
  358          return QLocale().toString( v.toDouble(), 
'g', d->precision );
 
  362          return QLocale().toString( v.toDouble(), 
'f', d->precision );
 
  369        const QString s( v.toString() );
 
  370        const int dotPosition( s.indexOf( 
'.' ) );
 
  372        if ( dotPosition < 0 && s.indexOf( 
'e' ) < 0 )
 
  375          return QLocale().toString( v.toDouble(), 
'f', 
precision );
 
  380          else precision = s.length() - dotPosition - 1;
 
  382          if ( -1 < v.toDouble() && v.toDouble() < 1 )
 
  384            return QLocale().toString( v.toDouble(), 
'g', 
precision );
 
  388            return QLocale().toString( v.toDouble(), 
'f', 
precision );
 
  394    else if ( d->precision > 0 )
 
  396      if ( -1 < v.toDouble() && v.toDouble() < 1 )
 
  398        return QString::number( v.toDouble(), 
'g', d->precision );
 
  402        return QString::number( v.toDouble(), 
'f', d->precision );
 
  407      const double vDouble = v.toDouble();
 
  409      if ( std::fabs( vDouble ) < 1e-04 )
 
  410        return QString::number( vDouble, 
'g', QLocale::FloatingPointShortest );
 
  412        return QString::number( vDouble, 
'f', QLocale::FloatingPointShortest );
 
  417            !( QLocale().numberOptions() & QLocale::NumberOption::OmitGroupSeparator ) )
 
  420    const qlonglong converted( v.toLongLong( &ok ) );
 
  422      return QLocale().toString( converted );
 
  424  else if ( d->typeName.compare( QLatin1String( 
"json" ), Qt::CaseInsensitive ) == 0 || d->typeName == QLatin1String( 
"jsonb" ) )
 
  426    const QJsonDocument doc = QJsonDocument::fromVariant( v );
 
  427    return QString::fromUtf8( doc.toJson().constData() );
 
  429  else if ( d->type == QMetaType::Type::QByteArray )
 
  431    return QObject::tr( 
"BLOB" );
 
  433  else if ( d->type == QMetaType::Type::QStringList || d->type == QMetaType::Type::QVariantList )
 
  436    const QVariantList list = v.toList();
 
  437    for ( 
const QVariant &var : list )
 
  439      if ( !result.isEmpty() )
 
  440        result.append( QStringLiteral( 
", " ) );
 
  441      result.append( var.toString() );
 
 
  455      return QObject::tr( 
"None" );
 
  457      return QObject::tr( 
"Not searchable" );
 
  459      return QObject::tr( 
"Do not expose via WMS" );
 
  461      return QObject::tr( 
"Do not expose via WFS" );
 
 
  474  const QVariant original = v;
 
  476    errorMessage->clear();
 
  480    v.convert( d->type );
 
  484  if ( d->type == QMetaType::Type::Int && v.toInt() != v.toLongLong() )
 
  488      *errorMessage = QObject::tr( 
"Value \"%1\" is too large for integer field" ).arg( original.toLongLong() );
 
  494  if ( d->type == QMetaType::Type::Double && v.userType() == QMetaType::Type::QString )
 
  497    if ( !tmp.convert( d->type ) )
 
  508      if ( QLocale().decimalPoint() != 
'.' )
 
  510        d = QLocale( QLocale::C ).toDouble( v.toString(), &ok );
 
  521  if ( d->type == QMetaType::Type::Int && v.userType() == QMetaType::Type::QString )
 
  524    if ( !tmp.convert( d->type ) )
 
  538  if ( d->type == QMetaType::Type::LongLong && v.userType() == QMetaType::Type::QString )
 
  541    if ( !tmp.convert( d->type ) )
 
  556  if ( d->type == QMetaType::Type::Int && v.canConvert( QMetaType::Type::Double ) )
 
  559    const double dbl = v.toDouble( &ok );
 
  566        *errorMessage = QObject::tr( 
"Value \"%1\" is not a number" ).arg( original.toString() );
 
  571    const double round = std::round( dbl );
 
  572    if ( round  > std::numeric_limits<int>::max() || round < -std::numeric_limits<int>::max() )
 
  578        *errorMessage = QObject::tr( 
"Value \"%1\" is too large for integer field" ).arg( original.toDouble() );
 
  582    v = QVariant( 
static_cast< int >( std::round( dbl ) ) );
 
  588  if ( d->type == QMetaType::Type::LongLong && v.canConvert( QMetaType::Type::Double ) )
 
  592    if ( !tmp.convert( d->type ) )
 
  595      const double dbl = v.toDouble( &ok );
 
  602          *errorMessage = QObject::tr( 
"Value \"%1\" is not a number" ).arg( original.toString() );
 
  607      const double round = std::round( dbl );
 
  608      if ( round  > 
static_cast<double>( std::numeric_limits<long long>::max() ) || round < 
static_cast<double>( -std::numeric_limits<long long>::max() ) )
 
  614          *errorMessage = QObject::tr( 
"Value \"%1\" is too large for long long field" ).arg( original.toDouble() );
 
  618      v = QVariant( 
static_cast< long long >( std::round( dbl ) ) );
 
  623  if ( d->typeName.compare( QLatin1String( 
"json" ), Qt::CaseInsensitive ) == 0 || d->typeName.compare( QLatin1String( 
"jsonb" ), Qt::CaseInsensitive ) == 0 )
 
  625    if ( d->type == QMetaType::Type::QString )
 
  627      const QJsonDocument doc = QJsonDocument::fromVariant( v );
 
  630        v = QString::fromUtf8( doc.toJson( QJsonDocument::Compact ).constData() );
 
  636    else if ( d->type == QMetaType::Type::QVariantMap )
 
  638      if ( v.userType() == QMetaType::Type::QStringList || v.userType() == QMetaType::Type::QVariantList || v.userType() == QMetaType::Type::QVariantMap )
 
  647  if ( ( d->type == QMetaType::Type::QStringList || ( d->type == QMetaType::Type::QVariantList && d->subType == QMetaType::Type::QString ) )
 
  648       && ( v.userType() == QMetaType::Type::QString ) )
 
  650    v = QStringList( { v.toString() } );
 
  654  if ( ( d->type == QMetaType::Type::QStringList || d->type == QMetaType::Type::QVariantList ) && !( v.userType() == QMetaType::Type::QStringList || v.userType() == QMetaType::Type::QVariantList ) )
 
  659      *errorMessage = QObject::tr( 
"Could not convert value \"%1\" to target list type" ).arg( original.toString() );
 
  665  if ( d->type == QMetaType::Type::QString && v.userType() == qMetaTypeId<QgsReferencedGeometry>() )
 
  674      v = QVariant( geom.asWkt() );
 
  678  else if ( d->type == QMetaType::Type::User && d->typeName.compare( QLatin1String( 
"geometry" ), Qt::CaseInsensitive ) == 0 )
 
  680    if ( v.userType() == qMetaTypeId<QgsReferencedGeometry>() || v.userType() == qMetaTypeId< QgsGeometry>() )
 
  684    else if ( v.userType() == QMetaType::Type::QString )
 
  689        v = QVariant::fromValue( geom );
 
  695  else if ( !v.convert( d->type ) )
 
  700      *errorMessage = QObject::tr( 
"Could not convert value \"%1\" to target type \"%2\"" )
 
  701                      .arg( original.toString(),
 
  707  if ( d->type == QMetaType::Type::Double && d->precision > 0 )
 
  709    const double s = std::pow( 10, d->precision );
 
  710    const double d = v.toDouble() * s;
 
  711    v = QVariant( ( d < 0 ? std::ceil( d - 0.5 ) : std::floor( d + 0.5 ) ) / s );
 
  715  if ( d->type == QMetaType::Type::QString && d->length > 0 && v.toString().length() > d->length )
 
  717    const int length = v.toString().length();
 
  718    v = v.toString().left( d->length );
 
  721      *errorMessage = QObject::tr( 
"String of length %1 exceeds maximum field length (%2)" ).arg( 
length ).arg( d->length );
 
 
  729QgsField::operator QVariant()
 const 
  731  return QVariant::fromValue( *
this );
 
 
  736  d->editorWidgetSetup = v;
 
 
  741  return d->editorWidgetSetup;
 
 
  746  d->isReadOnly = readOnly;
 
 
  751  return d->isReadOnly;
 
 
  756  return d->splitPolicy;
 
 
  761  d->splitPolicy = policy;
 
 
  766  return d->duplicatePolicy;
 
 
  771  d->duplicatePolicy = policy;
 
 
  783  out << static_cast< quint32 >( field.
type() );
 
  788  out << field.
alias();
 
  800  out << static_cast< quint32 >( field.
subType() );
 
 
  814  quint32 originNotNull;
 
  815  quint32 originUnique;
 
  816  quint32 originExpression;
 
  817  quint32 strengthNotNull;
 
  818  quint32 strengthUnique;
 
  819  quint32 strengthExpression;
 
  829  QString defaultValueExpression;
 
  830  QString constraintExpression;
 
  831  QString constraintDescription;
 
  832  QMap< int, QVariant > metadata;
 
  835     >> defaultValueExpression >> applyOnUpdate >> constraints >> originNotNull >> originUnique >> originExpression >> strengthNotNull >> strengthUnique >> strengthExpression >>
 
  836     constraintExpression >> constraintDescription >> subType >> splitPolicy >> duplicatePolicy >> metadata;
 
  838  field.
setType( 
static_cast< QMetaType::Type 
>( type ) );
 
  840  field.
setLength( 
static_cast< int >( length ) );
 
  871  field.
setSubType( 
static_cast< QMetaType::Type 
>( subType ) );
 
 
FieldDomainSplitPolicy
Split policy for field domains.
 
FieldDuplicatePolicy
Duplicate policy for fields.
 
FieldMetadataProperty
Standard field metadata values.
 
FieldConfigurationFlag
Configuration flags for fields These flags are meant to be user-configurable and are not describing a...
 
@ HideFromWfs
Field is not available if layer is served as WFS from QGIS server.
 
@ NoFlag
No flag is defined.
 
@ NotSearchable
Defines if the field is searchable (used in the locator search for instance)
 
@ HideFromWms
Field is not available if layer is served as WMS from QGIS server.
 
QFlags< FieldConfigurationFlag > FieldConfigurationFlags
Configuration flags for fields These flags are meant to be user-configurable and are not describing a...
 
static QString nullRepresentation()
Returns the string used to represent the value NULL throughout QGIS.
 
QString userFriendlyIdentifier(Qgis::CrsIdentifierType type=Qgis::CrsIdentifierType::MediumString) const
Returns a user friendly identifier for the CRS.
 
The QgsDefaultValue class provides a container for managing client side default values for fields.
 
Stores information about constraints which may be present on a field.
 
ConstraintStrength
Strength of constraints.
 
void setConstraintStrength(Constraint constraint, ConstraintStrength strength)
Sets the strength of a constraint.
 
void setConstraintExpression(const QString &expression, const QString &description=QString())
Set the constraint expression for the field.
 
ConstraintOrigin
Origin of constraints.
 
ConstraintStrength constraintStrength(Constraint constraint) const
Returns the strength of a field constraint, or ConstraintStrengthNotSet if the constraint is not pres...
 
ConstraintOrigin constraintOrigin(Constraint constraint) const
Returns the origin of a field constraint, or ConstraintOriginNotSet if the constraint is not present ...
 
QString constraintExpression() const
Returns the constraint expression for the field, if set.
 
@ ConstraintNotNull
Field may not be null.
 
@ ConstraintUnique
Field must have a unique value.
 
@ ConstraintExpression
Field has an expression constraint set. See constraintExpression().
 
void removeConstraint(Constraint constraint)
Removes a constraint from the field.
 
QString constraintDescription() const
Returns the descriptive name for the constraint expression.
 
void setConstraint(Constraint constraint, ConstraintOrigin origin=ConstraintOriginLayer)
Sets a constraint on the field.
 
Encapsulate a field in an attribute table or data source.
 
void setSplitPolicy(Qgis::FieldDomainSplitPolicy policy)
Sets the field's split policy, which indicates how field values should be handled during a split oper...
 
void setEditorWidgetSetup(const QgsEditorWidgetSetup &v)
Set the editor widget setup for the field.
 
QString typeName() const
Gets the field type.
 
void setConstraints(const QgsFieldConstraints &constraints)
Sets constraints which are present for the field.
 
void setAlias(const QString &alias)
Sets the alias for the field (the friendly displayed name of the field ).
 
bool operator!=(const QgsField &other) const
 
bool operator==(const QgsField &other) const
 
QgsField & operator=(const QgsField &other)
 
QString displayString(const QVariant &v) const
Formats string for display.
 
void setPrecision(int precision)
Set the field precision.
 
void setDuplicatePolicy(Qgis::FieldDuplicatePolicy policy)
Sets the field's duplicate policy, which indicates how field values should be handled during a duplic...
 
QString displayNameWithAlias() const
Returns the name to use when displaying this field and adds the alias in parenthesis if it is defined...
 
QgsField(const QString &name=QString(), QMetaType::Type type=QMetaType::Type::UnknownType, const QString &typeName=QString(), int len=0, int prec=0, const QString &comment=QString(), QMetaType::Type subType=QMetaType::Type::UnknownType)
Constructor.
 
bool convertCompatible(QVariant &v, QString *errorMessage=nullptr) const
Converts the provided variant to a compatible format.
 
void setSubType(QMetaType::Type subType)
If the field is a collection, set its element's type.
 
void setName(const QString &name)
Set the field name.
 
void setComment(const QString &comment)
Set the field comment.
 
void setType(QMetaType::Type type)
Set variant type.
 
QString displayType(bool showConstraints=false) const
Returns the type to use when displaying this field, including the length and precision of the datatyp...
 
void setConfigurationFlags(Qgis::FieldConfigurationFlags flags)
Sets the Flags for the field (searchable, …).
 
Qgis::FieldDomainSplitPolicy splitPolicy() const
Returns the field's split policy, which indicates how field values should be handled during a split o...
 
void setLength(int len)
Set the field length.
 
QString displayName() const
Returns the name to use when displaying this field.
 
void setDefaultValueDefinition(const QgsDefaultValue &defaultValueDefinition)
Sets an expression to use when calculating the default value for the field.
 
QString friendlyTypeString() const
Returns a user friendly, translated representation of the field type.
 
void setReadOnly(bool readOnly)
Make field read-only if readOnly is set to true.
 
QMap< int, QVariant > metadata() const
Returns the map of field metadata.
 
static QString readableConfigurationFlag(Qgis::FieldConfigurationFlag flag)
Returns the readable and translated value of the configuration flag.
 
Qgis::FieldConfigurationFlags configurationFlags
 
QMetaType::Type subType() const
If the field is a collection, gets its element's type.
 
Qgis::FieldDuplicatePolicy duplicatePolicy() const
Returns the field's duplicate policy, which indicates how field values should be handled during a dup...
 
static constexpr int MAX_WKT_LENGTH
 
QgsDefaultValue defaultValueDefinition
 
void setMetadata(const QMap< int, QVariant > metadata)
Sets the map of field metadata.
 
QgsFieldConstraints constraints
 
QgsEditorWidgetSetup editorWidgetSetup() const
Gets the editor widget setup for the field.
 
void setTypeName(const QString &typeName)
Set the field type.
 
A geometry is the spatial representation of a feature.
 
static Q_INVOKABLE QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
 
Q_INVOKABLE QString asWkt(int precision=17) const
Exports the geometry to WKT.
 
QgsCoordinateReferenceSystem crs() const
Returns the associated coordinate reference system, or an invalid CRS if no reference system is set.
 
A QgsGeometry with associated coordinate reference system.
 
Contains utility functions for working with QVariants and QVariant types.
 
static QMetaType::Type variantTypeToMetaType(QVariant::Type variantType)
Converts a QVariant::Type to a QMetaType::Type.
 
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
 
static QString typeToDisplayString(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType)
Returns a user-friendly translated string representing a QVariant type.
 
static QVariant createNullVariant(QMetaType::Type metaType)
Helper method to properly create a null QVariant from a metaType Returns the created QVariant.
 
qlonglong qgsPermissiveToLongLong(QString string, bool &ok)
Converts a string to an qlonglong in a permissive way, e.g., allowing for incorrect numbers of digits...
 
double qgsPermissiveToDouble(QString string, bool &ok)
Converts a string to a double in a permissive way, e.g., allowing for incorrect numbers of digits bet...
 
int qgsPermissiveToInt(QString string, bool &ok)
Converts a string to an integer in a permissive way, e.g., allowing for incorrect numbers of digits b...
 
QDataStream & operator>>(QDataStream &in, QgsField &field)
Reads a field from stream in into field. QGIS version compatibility is not guaranteed.
 
QDataStream & operator<<(QDataStream &out, const QgsField &field)
Writes the field to stream out. QGIS version compatibility is not guaranteed.