QString QgsClipboard::generateClipboardText() const { QgsSettings settings; CopyFormat format = AttributesWithWKT; if ( settings.contains( QStringLiteral( "/qgis/copyFeatureFormat" ) ) ) format = static_cast< CopyFormat >( settings.value( QStringLiteral( "qgis/copyFeatureFormat" ), true ).toInt() ); else { //old format setting format = settings.value( QStringLiteral( "qgis/copyGeometryAsWKT" ), true ).toBool() ? AttributesWithWKT : AttributesOnly; } switch ( format ) { case AttributesOnly: case AttributesWithWKT: { QStringList textLines; QStringList textFields; // first do the field names if ( format == AttributesWithWKT ) { textFields += QStringLiteral( "wkt_geom" ); } Q_FOREACH ( const QgsField &field, mFeatureFields ) { textFields += field.name(); } textLines += textFields.join( QStringLiteral( "\t" ) ); textFields.clear(); // then the field contents for ( QgsFeatureList::const_iterator it = mFeatureClipboard.constBegin(); it != mFeatureClipboard.constEnd(); ++it ) { QgsAttributes attributes = it->attributes(); // TODO: Set up Paste Transformations to specify the order in which fields are added. if ( format == AttributesWithWKT ) { if ( it->hasGeometry() ) textFields += it->geometry().exportToWkt(); else { textFields += QgsApplication::nullRepresentation(); } } // QgsDebugMsg("about to traverse fields."); for ( int idx = 0; idx < attributes.count(); ++idx ) { // QgsDebugMsg(QString("inspecting field '%1'.").arg(it2->toString())); textFields += attributes.at( idx ).toString(); } textLines += textFields.join( QStringLiteral( "\t" ) ); textFields.clear(); } return textLines.join( QStringLiteral( "\n" ) ); } case GeoJSON: { QgsJSONExporter exporter; exporter.setSourceCrs( mCRS ); return exporter.exportFeatures( mFeatureClipboard ); } } return QString(); }
void QgsClipboard::setSystemClipboard() { // Replace the system clipboard. QSettings settings; bool copyWKT = settings.value( "qgis/copyGeometryAsWKT", true ).toBool(); QStringList textLines; QStringList textFields; // first do the field names if ( copyWKT ) { textFields += "wkt_geom"; } Q_FOREACH ( const QgsField& field, mFeatureFields ) { textFields += field.name(); } textLines += textFields.join( "\t" ); textFields.clear(); // then the field contents for ( QgsFeatureList::const_iterator it = mFeatureClipboard.constBegin(); it != mFeatureClipboard.constEnd(); ++it ) { QgsAttributes attributes = it->attributes(); // TODO: Set up Paste Transformations to specify the order in which fields are added. if ( copyWKT ) { if ( it->constGeometry() ) textFields += it->constGeometry()->exportToWkt(); else { textFields += settings.value( "qgis/nullValue", "NULL" ).toString(); } } // QgsDebugMsg("about to traverse fields."); for ( int idx = 0; idx < attributes.count(); ++idx ) { // QgsDebugMsg(QString("inspecting field '%1'.").arg(it2->toString())); textFields += attributes.at( idx ).toString(); } textLines += textFields.join( "\t" ); textFields.clear(); } QString textCopy = textLines.join( "\n" ); QClipboard *cb = QApplication::clipboard(); // Copy text into the clipboard // With qgis running under Linux, but with a Windows based X // server (Xwin32), ::Selection was necessary to get the data into // the Windows clipboard (which seems contrary to the Qt // docs). With a Linux X server, ::Clipboard was required. // The simple solution was to put the text into both clipboards. #ifdef Q_OS_LINUX cb->setText( textCopy, QClipboard::Selection ); #endif cb->setText( textCopy, QClipboard::Clipboard ); QgsDebugMsgLevel( QString( "replaced system clipboard with: %1." ).arg( textCopy ), 4 ); }