Skip to content

Instantly share code, notes, and snippets.

@wonder-sk
Created August 22, 2014 04:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save wonder-sk/c5d925833bcd54b9e401 to your computer and use it in GitHub Desktop.
Save wonder-sk/c5d925833bcd54b9e401 to your computer and use it in GitHub Desktop.
QGIS custom legend + legend node
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
# iface.activeLayer().setLegend(RasterRampLegend(iface.activeLayer()))
# nodeLayer = QgsProject.instance().layerTreeRoot().children()[0]
class RasterRampLegend(QgsMapLayerLegend):
def __init__(self, rlayer):
QgsMapLayerLegend.__init__(self)
self.rlayer = rlayer
def createLayerTreeModelLegendNodes(self, nodeLayer):
r = self.rlayer.renderer()
if not isinstance(r, QgsSingleBandPseudoColorRenderer):
return []
items = r.shader().rasterShaderFunction().colorRampItemList()
vMin, vMax = items[0].value, items[-1].value
stops = [ QgsGradientStop( (item.value-vMin) / (vMax-vMin), item.color ) for item in items[1:-1] ]
ramp = QgsVectorGradientColorRampV2(items[0].color, items[-1].color, False, stops)
return [RasterRampLegendNode(nodeLayer, ramp, self)]
class RasterRampLegendNode(QgsLayerTreeModelLegendNode):
def __init__(self, nodeLayer, ramp, parent):
QgsLayerTreeModelLegendNode.__init__(self, nodeLayer, parent)
self.ramp = ramp
def data(self, role):
if role == Qt.DisplayRole:
return ""
elif role == Qt.DecorationRole:
return QgsSymbolLayerV2Utils.colorRampPreviewPixmap(self.ramp, QSize(200,24))
else:
return
def drawSymbol(self, settings, ctx, itemHeight):
size = settings.symbolSize()
if ctx:
pix = QgsSymbolLayerV2Utils.colorRampPreviewPixmap(self.ramp, QSize(500,200))
ctx.painter.drawPixmap(QRectF(ctx.point.x(),ctx.point.y(),size.width()*4,size.height()), pix, QRectF(0,0,pix.width(),pix.height()))
return size
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment