def layoutLoader(self, template_source, layout_name, title_text): """ Generate the layout """ from qgis.core import (QgsProject, QgsPrintLayout, QgsReadWriteContext) from qgis.utils import iface from PyQt5.QtXml import QDomDocument #template_source = '/home/user/Document/Template.qpt' #layout_name = 'NewLayout' #title_text = 'New Title' # Create objects lm = layout manager, l = print layout lm = QgsProject.instance().layoutManager() l = QgsPrintLayout(QgsProject.instance()) l.initializeDefaults() # Load template file and load it into the layout (l) template_file = open(template_source, 'r+', encoding='utf-8') template_content = template_file.read() template_file.close() document = QDomDocument() document.setContent(template_content) context = QgsReadWriteContext() l.loadFromTemplate(document, context) # Give the layout a name (must be unique) l.setName(layout_name) # Get current canvas extent and apply that to all maps (items) in layout # Replace any text "{{title}}" in any layout label with the dialog Title text canvas = iface.mapCanvas() for item in l.items(): if item.type() == 65639: # Map item.zoomToExtent(canvas.extent()) if item.type() == 65641: # Label item.setText(item.text().replace('{{title}}', title_text)) # Add layout to layout manager l.refresh() lm.addLayout(l) # Open and show the layout in designer try: iface.openLayoutDesigner(l) except: oopsBox = QMessageBox() oopsBox.setIcon(QMessageBox.Warning) oopsBox.setText( self. tr('Ooops. Something went wrong. Trying to open the generated layout ({}) returned errors.' .format(l.name()))) oopsBox.setWindowTitle(self.tr('Layout Loader')) oopsBox.exec_()
class layerOut(QDialog,Ui_decorationDialog): def __init__(self, proj,qssStyle): super(layerOut, self).__init__() self.setupUi(self) self.project = proj print(self.project) self.initLayerOut() self.slot_connect() self.font = QFont('Arial', 24) self.color = QColor('black') # styleFile = './QSS-master/ElegantDark.qss' # qssStyle = CommonHelper.readQSS(styleFile) QDialog.setStyleSheet(self, qssStyle) def initLayerOut(self): self.layout = QgsPrintLayout(self.project) self.layout.initializeDefaults() self.QgsLayerView = QgsLayoutView() self.QgsLayerView.setPreviewModeEnabled(True) self.QgsLayerView.setContentsMargins(0,0,0,0) # self.QgsLayerView.resize(800,600) self.QgsLayerView.setCurrentLayout(self.layout) self.QgsLayerView.setPreviewMode(QgsPreviewEffect.PreviewDeuteranope) # self.QgsLayerView.setPreviewMode(QgsPreviewEffect.PreviewMode) self.QgsLayerView.unlockAllItems() self.layout.refresh() self.QgsLayerView.cursorPosChanged.connect(self.show_lonlat) self.selectTool = QgsLayoutViewToolSelect(self.QgsLayerView) self.selectTool.setLayout(self.layout) Layout = QVBoxLayout(self.widget) Layout.setContentsMargins(0, 0, 0, 0) Layout.addWidget(self.QgsLayerView) for layer in self.project.mapLayers().values(): self.comboBox.addItem(layer.name()) self.effect.addItem('PreviewGrayscale') self.effect.addItem('PreviewMono') self.effect.addItem('PreviewProtanope') self.effect.addItem('PreviewDeuteranope') def slot_connect(self): self.addMap.clicked.connect(self.createMap) self.addTitle.clicked.connect(self.createTittle) self.addLegend.clicked.connect(self.createLegend) self.addScale.clicked.connect(self.createScaleBar) self.exportPDF.clicked.connect(self.saveAsPDF) self.exportIMG.clicked.connect(self.saveAsIMG) self.getFont.clicked.connect(self.setFont) self.getColor.clicked.connect(self.setColor) self.deleteItem.clicked.connect(self.deleteSelectItem) self.changeEffect.clicked.connect(self.setEffect) def createMap(self): try: self.map = QgsLayoutItemMap(self.layout) self.map.setLocked(False) self.map.attemptSetSceneRect(QRectF(8.5, 20, 200, 160)) self.map.setFrameEnabled(True) layer = self.project.mapLayersByName(self.comboBox.currentText())[0] # layer.renderer().setRedBand(3) # layer.renderer().setGreenBand(2) # layer.renderer().setBlueBand(1) self.map.setLayers([layer]) self.map.setBackgroundColor(QColor(255, 255, 255)) self.map.zoomToExtent(layer.extent()) self.layout.addItem(self.map) except: pass # polygon = QPolygonF() # polygon.append(QPointF(0.0, 0.0)) # polygon.append(QPointF(100.0, 0.0)) # polygon.append(QPointF(200.0, 100.0)) # polygon.append(QPointF(100.0, 200.0)) # # polygonItem = QgsLayoutItemPolygon(polygon, self.layout) # self.layout.addItem(polygonItem) # # props = {} # props["color"] = "green" # props["style"] = "solid" # props["style_border"] = "solid" # props["color_border"] = "black" # props["width_border"] = "10.0" # props["joinstyle"] = "miter" # # symbol = QgsFillSymbol.createSimple(props) # polygonItem.setSymbol(symbol) def createTittle(self): title = QgsLayoutItemLabel(self.layout) # title.setLocked(False) title.setText(self.title.text()) title.setFont(self.font) title.setFontColor(self.color) title.adjustSizeToText() self.layout.addLayoutItem(title) title.attemptMove(QgsLayoutPoint(130, 5, QgsUnitTypes.LayoutMillimeters)) def createLegend(self): try: legend = QgsLayoutItemLegend(self.layout) legend.setTitle("Legend") legend.setLinkedMap(self.map) # map is an instance of QgsLayoutItemMap self.layout.addItem(legend) legend.attemptMove(QgsLayoutPoint(230, 15, QgsUnitTypes.LayoutMillimeters)) except: pass def createScaleBar(self): try: scalebar = QgsLayoutItemScaleBar(self.layout) scalebar.setStyle('Line Ticks Up') scalebar.setUnits(QgsUnitTypes.DistanceKilometers) scalebar.setNumberOfSegments(6) scalebar.setNumberOfSegmentsLeft(0) scalebar.setUnitsPerSegment(2) scalebar.setLinkedMap(self.map) scalebar.setUnitLabel('km') scalebar.setFont(QFont('Arial', 14)) scalebar.update() self.layout.addLayoutItem(scalebar) scalebar.attemptMove(QgsLayoutPoint(180, 190, QgsUnitTypes.LayoutMillimeters)) except: pass def saveAsPDF(self): fullpath, format = QFileDialog.getSaveFileName(self, '存储为pdf', '', '*.pdf') print(fullpath) exporter = QgsLayoutExporter(self.layout) exporter.exportToPdf(fullpath, QgsLayoutExporter.PdfExportSettings()) def saveAsIMG(self): fullpath, format = QFileDialog.getSaveFileName(self, '存储为img', '', '*.jpg;;*.png') print(fullpath) exporter = QgsLayoutExporter(self.layout) exporter.exportToImage(fullpath, QgsLayoutExporter.ImageExportSettings()) def setFont(self): font, ok = QFontDialog.getFont() if ok: self.font = font def setColor(self): self.color = QColorDialog.getColor() print(self.color) def show_lonlat(self, point): # print(point) self.mousePos = point def deleteSelectItem(self): print('delete...') # print(self.QgsLayerView.itemFocused()) try: self.QgsLayerView.deleteSelectedItems() except: pass def setEffect(self): # self.effect.addItem('PreviewGrayscale') # self.effect.addItem('PreviewMono') # self.effect.addItem('PreviewProtanope') # self.effect.addItem('PreviewDeuteranope') if self.effect.currentText() == 'PreviewGrayscale': self.QgsLayerView.setPreviewMode(QgsPreviewEffect.PreviewGrayscale) elif self.effect.currentText() == 'PreviewMono': self.QgsLayerView.setPreviewMode(QgsPreviewEffect.PreviewMono) elif self.effect.currentText() == 'PreviewProtanope': self.QgsLayerView.setPreviewMode(QgsPreviewEffect.PreviewProtanope) elif self.effect.currentText() == 'PreviewDeuteranope': self.QgsLayerView.setPreviewMode(QgsPreviewEffect.PreviewDeuteranope)