31 d =
new QgsFieldsPrivate();
47 d =
new QgsFieldsPrivate();
60 d->nameToIndex.clear();
71 if ( d->nameToIndex.contains(
field.
name() ) )
75 originIndex = d->fields.count();
76 d->fields.append(
Field(
field, origin, originIndex ) );
78 d->nameToIndex.insert(
field.
name(), d->fields.count() - 1 );
86 if ( d->nameToIndex.contains(
field.
name() ) )
101 if ( d->nameToIndex.contains(
field.
name() ) )
105 for (
int i = 0; i < fields.
size(); ++ i )
114 if ( !
exists( fieldIdx ) )
117 if ( name.isEmpty() )
120 if ( d->nameToIndex.contains( name ) )
123 const QString oldName = d->fields[ fieldIdx ].field.name();
124 d->fields[ fieldIdx ].field.setName( name );
125 d->nameToIndex.remove( oldName );
126 d->nameToIndex.insert( name, fieldIdx );
132 if ( d->nameToIndex.contains(
field.
name() ) )
137 d->nameToIndex.insert(
field.
name(), d->fields.count() - 1 );
143 if ( !
exists( fieldIdx ) )
146 d->fields.remove( fieldIdx );
147 d->nameToIndex.clear();
148 for (
int idx = 0; idx <
count(); ++idx )
150 d->nameToIndex.insert( d->fields.at( idx ).field.name(), idx );
156 for (
int i = 0; i < other.
count(); ++i )
170 return d->fields.isEmpty();
175 return d->fields.count();
180 return d->fields.count();
186 for (
int i = 0; i < d->fields.count(); ++i )
188 lst.append( d->fields[i].field.name() );
195 return i >= 0 && i < d->fields.count();
200 return d->fields[i].field;
205 return d->fields[i].field;
210 return d->fields[fieldIdx].field;
226 return d->fields[i].field;
231 if ( !
exists( fieldIdx ) )
234 return d->fields[fieldIdx].origin;
239 return d->fields[fieldIdx].originIndex;
244 return d->nameToIndex.value( fieldName, -1 );
249 return d->nameToIndex.value( fieldName, -1 );
255 for (
int i = 0; i < d->fields.count(); ++i )
256 lst.append( d->fields[i].field );
262 return d->fields == other.d->fields;
267 if ( d->fields.isEmpty() )
268 return const_iterator();
270 return const_iterator( &d->fields.first() );
275 if ( d->fields.isEmpty() )
276 return const_iterator();
278 return const_iterator( &d->fields.last() + 1 );
283 if ( d->fields.isEmpty() )
284 return const_iterator();
286 return const_iterator( &d->fields.first() );
291 if ( d->fields.isEmpty() )
292 return const_iterator();
294 return const_iterator( &d->fields.last() + 1 );
299 if ( d->fields.isEmpty() )
303 return iterator( &d->fields.first() );
308 if ( d->fields.isEmpty() )
312 return iterator( &d->fields.last() + 1 );
317 if ( considerOrigin )
328 return iconForFieldType( d->fields.at( fieldIdx ).field.type(), d->fields.at( fieldIdx ).field.subType(), d->fields.at( fieldIdx ).field.typeName() );
331 return iconForFieldType( d->fields.at( fieldIdx ).field.type(), d->fields.at( fieldIdx ).field.subType(), d->fields.at( fieldIdx ).field.typeName() );
338 case QMetaType::Type::Bool:
340 case QMetaType::Type::Int:
341 case QMetaType::Type::UInt:
342 case QMetaType::Type::LongLong:
343 case QMetaType::Type::ULongLong:
345 case QMetaType::Type::Double:
347 case QMetaType::Type::QString:
349 case QMetaType::Type::QDate:
351 case QMetaType::Type::QDateTime:
353 case QMetaType::Type::QTime:
355 case QMetaType::Type::QByteArray:
357 case QMetaType::Type::QVariantList:
361 case QMetaType::Type::Int:
362 case QMetaType::Type::UInt:
363 case QMetaType::Type::LongLong:
364 case QMetaType::Type::ULongLong:
366 case QMetaType::Type::Double:
368 case QMetaType::Type::QString:
374 case QMetaType::Type::QStringList:
376 case QMetaType::Type::QVariantMap:
378 case QMetaType::Type::User:
379 if ( typeString.compare( QLatin1String(
"geometry" ) ) == 0 )
406 for (
int idx = 0; idx <
count(); ++idx )
408 if ( d->fields[idx].field.name() == fieldName )
412 if ( fieldName.isEmpty() )
415 for (
int idx = 0; idx <
count(); ++idx )
417 if ( QString::compare( d->fields[idx].field.name(), fieldName, Qt::CaseInsensitive ) == 0 )
421 for (
int idx = 0; idx <
count(); ++idx )
423 const QString alias = d->fields[idx].field.alias();
424 if ( !alias.isEmpty() && QString::compare( alias, fieldName, Qt::CaseInsensitive ) == 0 )
433 const int count = d->fields.count();
435 lst.reserve(
count );
436 for (
int i = 0; i <
count; ++i )
449 out << static_cast< quint32 >( fields.
size() );
450 for (
int i = 0; i < fields.
size(); i++ )
452 out << fields.
field( i );
462 for ( quint32 i = 0; i < size; i++ )
@ Provider
Field originates from the underlying data provider of the vector layer.
@ Unknown
The field origin has not been specified.
@ Expression
Field is calculated from an expression.
@ Join
Field originates from a joined layer.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
void extend(const QgsFields &other)
Extends with fields from another QgsFields container.
const_iterator constEnd() const noexcept
Returns a const STL-style iterator pointing to the imaginary item after the last item in the list.
QList< QgsField > toList() const
Utility function to return a list of QgsField instances.
QgsAttributeList allAttributesList() const
Utility function to get list of attribute indexes.
bool operator==(const QgsFields &other) const
bool appendExpressionField(const QgsField &field, int originIndex)
Appends an expression field. The field must have unique name, otherwise it is rejected (returns false...
Q_INVOKABLE int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
Q_INVOKABLE int indexOf(const QString &fieldName) const
Gets the field index from the field name.
void remove(int fieldIdx)
Removes the field with the given index.
const_iterator begin() const noexcept
Returns a const STL-style iterator pointing to the first item in the list.
static QIcon iconForFieldType(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType, const QString &typeString=QString())
Returns an icon corresponding to a field type.
QgsField field(int fieldIdx) const
Returns the field at particular index (must be in range 0..N-1).
QgsFields & operator=(const QgsFields &other)
QgsField operator[](int i) const
Gets field at particular index (must be in range 0..N-1)
QgsFields()
Constructor for an empty field container.
Qgis::FieldOrigin fieldOrigin(int fieldIdx) const
Returns the field's origin (value from an enumeration).
Q_INVOKABLE bool exists(int i) const
Returns if a field index is valid.
int size() const
Returns number of items.
void clear()
Removes all fields.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
int fieldOriginIndex(int fieldIdx) const
Returns the field's origin index (its meaning is specific to each type of origin).
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
QIcon iconForField(int fieldIdx, bool considerOrigin=false) const
Returns an icon corresponding to a field index, based on the field's type and source.
const_iterator end() const noexcept
Returns a const STL-style iterator pointing to the imaginary item after the last item in the list.
bool rename(int fieldIdx, const QString &name)
Renames a name of field.
const_iterator constBegin() const noexcept
Returns a const STL-style iterator pointing to the first item in the list.
static QMetaType::Type variantTypeToMetaType(QVariant::Type variantType)
Converts a QVariant::Type to a QMetaType::Type.
QList< int > QgsAttributeList
QDataStream & operator>>(QDataStream &in, QgsFields &fields)
Reads fields from stream in into fields. QGIS version compatibility is not guaranteed.
QDataStream & operator<<(QDataStream &out, const QgsFields &fields)
Writes the fields to stream out. QGIS version compatibility is not guaranteed.