📄 qgslegendlayerfile.cpp
字号:
// Give the table the most recent copy of the actions for this layer. mTableDisplay->table()->setAttributeActions(actions); // select rows which should be selected selectionChanged(); // etablish the necessary connections between the table and the vector layer connect(mTableDisplay->table(), SIGNAL(selected(int, bool)), mLyr.layer(), SLOT(select(int, bool))); connect(mTableDisplay->table(), SIGNAL(selectionRemoved(bool)), mLyr.layer(), SLOT(removeSelection(bool))); connect(mTableDisplay->table(), SIGNAL(repaintRequested()), mLyr.layer(), SLOT(triggerRepaint())); QApplication::restoreOverrideCursor(); }}void QgsLegendLayerFile::invalidateTableDisplay(){ // from signal deleted() - table doesn't exist anymore, just erase our pointer mTableDisplay = 0;}void QgsLegendLayerFile::selectionChanged(){ if (!mTableDisplay) return; QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>(mLyr.layer()); const QgsFeatureIds& ids = vlayer->selectedFeaturesIds(); mTableDisplay->table()->selectRowsWithId(ids);}void QgsLegendLayerFile::closeTable(bool onlyGeometryWasChanged){ if (mTableDisplay) { mTableDisplay->close(); delete mTableDisplay; mTableDisplay = NULL; }}void QgsLegendLayerFile::saveAsShapefile(){ saveAsShapefileGeneral(FALSE);}void QgsLegendLayerFile::saveSelectionAsShapefile(){ saveAsShapefileGeneral(TRUE);}void QgsLegendLayerFile::saveAsShapefileGeneral(bool saveOnlySelection){ if (mLyr.layer()->type() != QgsMapLayer::VECTOR) return; QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>(mLyr.layer()); // get a name for the shapefile // Get a file to process, starting at the current directory QSettings settings; QString filter = QString("Shapefiles (*.shp)"); QString dirName = settings.readEntry("/UI/lastShapefileDir", "."); QgsEncodingFileDialog* openFileDialog = new QgsEncodingFileDialog(0, tr("Save layer as..."), dirName, filter, QString("UTF-8")); openFileDialog->setAcceptMode(QFileDialog::AcceptSave); // allow for selection of more than one file //openFileDialog->setMode(QFileDialog::AnyFile); if (openFileDialog->exec() != QDialog::Accepted) return; QString encoding = openFileDialog->encoding(); QString shapefileName = openFileDialog->selectedFile(); settings.writeEntry("/UI/lastShapefileDir", QFileInfo(shapefileName).absolutePath()); if (shapefileName.isNull()) return; // add the extension if not present if (shapefileName.find(".shp") == -1) { shapefileName += ".shp"; } // overwrite the file - user will already have been prompted // to verify they want to overwrite by the file dialog above if (QFile::exists(shapefileName)) { if (!QgsVectorFileWriter::deleteShapeFile(shapefileName)) { return; } } // ok if the file existed it should be deleted now so we can continue... QApplication::setOverrideCursor(Qt::waitCursor); QgsVectorFileWriter::WriterError error; error = QgsVectorFileWriter::writeAsShapefile(vlayer, shapefileName, encoding, saveOnlySelection); QApplication::restoreOverrideCursor(); switch (error) { case QgsVectorFileWriter::NoError: QMessageBox::information(0, tr("Saving done"), tr("Export to Shapefile has been completed")); break; case QgsVectorFileWriter::ErrDriverNotFound: QMessageBox::warning(0, tr("Driver not found"), tr("ESRI Shapefile driver is not available")); break; case QgsVectorFileWriter::ErrCreateDataSource: QMessageBox::warning(0, tr("Error creating shapefile"), tr("The shapefile could not be created (") + shapefileName + ")"); break; case QgsVectorFileWriter::ErrCreateLayer: QMessageBox::warning(0, tr("Error"), tr("Layer creation failed")); break; case QgsVectorFileWriter::ErrAttributeTypeUnsupported: QMessageBox::warning(0, tr("Error"), tr("Layer attribute table contains unsupported datatype(s)")); break; }}void QgsLegendLayerFile::toggleEditing(){ QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>(mLyr.layer()); if (!vlayer) return; if (!vlayer->isEditable()) { vlayer->startEditing(); if(!(vlayer->getDataProvider()->capabilities() & QgsVectorDataProvider::AddFeatures)) { QMessageBox::information(0,tr("Start editing failed"), tr("Provider cannot be opened for editing")); } else { vlayer->triggerRepaint(); } } else { if(vlayer->isModified()) { // commit or roll back? QMessageBox::StandardButton commit = QMessageBox::information(0,tr("Stop editing"), tr("Do you want to save the changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if(commit==QMessageBox::Save) { if(!vlayer->commitChanges()) { QMessageBox::information(0,tr("Error"),tr("Could not commit changes")); // Leave the in-memory editing state alone, // to give the user a chance to enter different values // and try the commit again later } } else if(commit==QMessageBox::Discard) { if(!vlayer->rollBack()) { QMessageBox::information(0,tr("Error"), tr("Problems during roll back")); } } else //cancel { return; } } else //layer not modified { vlayer->rollBack(); } vlayer->triggerRepaint(); } updateLegendItem();}bool QgsLegendLayerFile::isEditing(){ QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>(mLyr.layer()); return vlayer && vlayer->isEditable();} void QgsLegendLayerFile::layerNameChanged(){ QString name = mLyr.layer()->name(); setText(0, name); // set also parent's name legend()->setName(this, name);}void QgsLegendLayerFile::addToPopupMenu(QMenu& theMenu, QAction* toggleEditingAction){ QgsMapLayer* lyr = layer(); QString iconsPath = QgsApplication::themePath(); // zoom to layer extent theMenu.addAction(QIcon(iconsPath+QString("/mActionZoomToLayer.png")), tr("&Zoom to layer extent"), legend(), SLOT(legendLayerZoom())); // show in overview QAction* showInOverviewAction = theMenu.addAction(tr("&Show in overview"), this, SLOT(showInOverview())); showInOverviewAction->setCheckable(true); showInOverviewAction->blockSignals(true); showInOverviewAction->setChecked(mLyr.inOverview()); showInOverviewAction->blockSignals(false); // remove from canvas theMenu.addAction(QIcon(iconsPath+QString("/mActionRemove.png")), tr("&Remove"), legend(), SLOT(legendLayerRemove())); theMenu.addSeparator(); if (lyr->type() == QgsMapLayer::VECTOR) { QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>(lyr); // attribute table theMenu.addAction(tr("&Open attribute table"), this, SLOT(table())); // editing int cap = vlayer->getDataProvider()->capabilities(); if ((cap & QgsVectorDataProvider::AddFeatures) ||(cap & QgsVectorDataProvider::DeleteFeatures)) { if(toggleEditingAction) { theMenu.addAction(toggleEditingAction); } } // save as shapefile theMenu.addAction(tr("Save as shapefile..."), this, SLOT(saveAsShapefile())); QAction* saveSelectionAction = theMenu.addAction(tr("Save selection as shapefile..."), this, SLOT(saveSelectionAsShapefile())); if (vlayer->selectedFeatureCount() == 0) { saveSelectionAction->setEnabled(false); } theMenu.addSeparator(); } else if (lyr->type() == QgsMapLayer::RASTER) { // TODO: what was this for? //QgsRasterLayer* rlayer = dynamic_cast<QgsRasterLayer*>(lyr); //theMenu.addAction(tr("&Convert to..."), rlayer, SLOT(convertTo())); } // properties goes on bottom of menu for consistency with normal ui standards // e.g. kde stuff theMenu.addAction(tr("&Properties"), legend(), SLOT(legendLayerShowProperties()));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -