6 votos

¿Cómo hacer que los elementos del mapa añadidos mediante programación aparezcan en la lista de elementos del compositor?

Intento hacer un compositor a través de la pitón. Agrego un ítem, hago una vista de compositor y la abro, pero no puedo ver el ítem en el muelle de "Ítems". Además, cuando lo selecciono, no veo las propiedades de los artículos en el dock "Propiedades de los artículos".

from qgis.core import *
from qgis.utils import iface
from PyQt4.QtCore import *
from PyQt4.QtGui import *

# make a composition
mapRenderer = iface.mapCanvas().mapRenderer()
c = QgsComposition(mapRenderer)
c.setPlotStyle(QgsComposition.Print)
view = iface.createNewComposer()

# add label
lbl = QgsComposerLabel(c)
lbl.setText("test text")
lbl.setItemPosition(10,10)
lbl.adjustSizeToText()
c.addComposerLabel(lbl)

# view composer
view.setComposition(c)

enter image description here

¿Cómo puedo arreglarlo?

UPD: Configuré el modelo de mi artículo y ahora lo veo en el muelle de artículos, pero las propiedades aún no se muestran en .... Código adicional:

# find items and items prop widget
win = view.composerWindow()
items_widget = win.findChildren(QDockWidget, 'ItemsDock')[0]
items_prop_widget = win.findChildren(QDockWidget, 'ItemDock')[0]

# set items model
items_list_widget = items_widget.findChildren(QTreeView,'')[0]
items_model = c.itemsModel()
items_list_widget.setModel(items_model)

enter image description here

4voto

Andy Brandi Puntos 650

He creado un problema en el rastreador de bichos, porque es muy extraño.

Gran trabajo en tu código, pero para arreglar los valores de ocultamiento al hacer clic en la etiqueta sólo hay que cambiar algunas cosas. El método mapRenderer = iface.mapCanvas().mapRenderer() está desaconsejado, necesitas un cambio para mapRenderer = iface.mapCanvas().mapSettings() . Otro cambio es que necesitas llamar a view.setComposition(c) antes de añadir una etiqueta.

el código completo.

from qgis.core import *
from qgis.utils import iface
from PyQt4.QtCore import *
from PyQt4.QtGui import *

# make a composition
mapRenderer = iface.mapCanvas().mapSettings()
c = QgsComposition(mapRenderer)
c.setPlotStyle(QgsComposition.Print)
view = iface.createNewComposer()

# view composer
view.setComposition(c)

#Fix error
view.setCurrentTool( view.AddLabel ) 
view.setCurrentTool( view.Select )

# add label
lbl = QgsComposerLabel(c)
lbl.setText("test text")
lbl.setItemPosition(10,10)
lbl.adjustSizeToText()
c.addComposerLabel(lbl)

# find items and items prop widget
win = view.composerWindow()
items_widget = win.findChildren(QDockWidget, 'ItemsDock')[0]
#items_prop_widget = win.findChildren(QWidget, 'ItemDock')[0]

# set items model
items_list_widget = items_widget.findChildren(QTreeView,'')[0]
items_model = c.itemsModel()
items_list_widget.setModel(items_model)

Actualiza el código: Resuelto el problema de la señal.

He borrado algunas líneas innecesarias y he añadido la señal de conexión.

QObject.connect( items_list_widget.selectionModel(), SIGNAL("currentChanged( QModelIndex, QModelIndex)"), c.itemsModel(),SLOT("setSelected( QModelIndex )"))

Código completo

from qgis.core import *
from qgis.utils import iface
from PyQt4.QtCore import *
from PyQt4.QtGui import *

# make a composition
mapRenderer = iface.mapCanvas().mapSettings()
c = QgsComposition(mapRenderer)
c.setPlotStyle(QgsComposition.Print)
view = iface.createNewComposer()

# view composer
view.setComposition(c)

#Add Map
rect = QgsRectangle(mapRenderer.fullExtent())
composer_map = QgsComposerMap(c, 0, 0, c.paperWidth(), c.paperHeight())
composer_map.setNewExtent(rect)
composer_map.updateItem()
c.addComposerMap(composer_map)

# add label
lbl = QgsComposerLabel(c)
lbl.setText("test text")
lbl.setItemPosition(10,10)
lbl.adjustSizeToText()
c.addComposerLabel(lbl)

# add label
lbl = QgsComposerLabel(c)
lbl.setText("other text")
lbl.setItemPosition(50,10)
lbl.adjustSizeToText()
c.addComposerLabel(lbl)

# find items and items prop widget
win = view.composerWindow()
items_widget = win.findChildren(QDockWidget, 'ItemsDock')[0]

items_widget_prop = win.findChildren(QDockWidget, 'ItemDock')[0]
items_widget_prop.show()

# set items model
items_list_widget = items_widget.findChildren(QTreeView,'')[0]
items_model = c.itemsModel()
items_list_widget.setModel(items_model)

QObject.connect( items_list_widget.selectionModel(), SIGNAL("currentChanged( QModelIndex, QModelIndex)"), c.itemsModel(),SLOT("setSelected( QModelIndex )"))

Resultado.

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X