[Qgis-developer] How do I change the symbol and its size from a
provider?
Tim Sutton
tim at linfiniti.com
Sat Jan 26 09:38:39 EST 2008
Hi
I forgot the qgisappinterface also has a
virtual void refreshLegend(QgsMapLayer *l);
call that you could use which is probably than the original approach I
mentioned.
Regards
Tim
2008/1/23, Tim Sutton <tim at linfiniti.com>:
> Hi
>
> Yeah sorry the layer map has been changed to QMap in svn trunk so your
> plugin will need a small update when 0.9.2rc1 comes out. Note that the
> api will undergo changes until the 1.0 release at which point it will
> be maintains in a backwards compatible state for the 1.x releases.
>
> The second part of your question relates to the legend not refreshing.
> You need to tell it to refresh after making changes to the symbology.
> A good place to look how this is done is in
>
> src/gui/qgsvectorlayerproperties.cpp/h
>
> You will see it has a signal
>
> 71 signals: 72
> 73 /** emitted when changes to layer were saved to update legend */
> 74 void refreshLegend(QString layerID, bool expandItem);
>
> This is connected to the legend instance when the vector layer props
> dialog is opened from the legend context menu:
>
> legend/qgslegend.cpp: connect(vlp,
> SIGNAL(refreshLegend(QString,bool)), this,
> SLOT(refreshLayerSymbology(QString,bool)));
>
> In your case since you are not in the context of legend when opening
> your dialog you will need to get teh legend instance from the qgis
> application instance via the plugin interface, and connect your signal
> that way.
>
> Hope that helps!
>
> Regards
>
> Tim
>
>
> 2008/1/23, Ken Roser <kroser at roser.us>:
> > This was very helpful. I noticed the layer map was actually a std::map
> > instead of a QMap, so I had to change to code to adjust to that. I can
> > now display my custom symbol on the map, but I noticed the graphic for
> > the symbol you see on the stack of layers on the left pane of QGIS
> > doesn't show my new symbol. How would I update that symbol also?
> >
> > Tim Sutton wrote:
> > > Hi
> > >
> > > You would need to create a modified version of the delimited text
> > > plugin (the gui not the provider). After the gui creates the
> > > vectorlayer based on the delimited text provider, you would apply your
> > > symbology using code similar to my last post, and then return control
> > > to the user interface. Here is the logic trail:
> > >
> > > http://svn.qgis.org/trac/browser/trunk/qgis/src/plugins/delimited_text/qgsdelimitedtextplugingui.cpp
> > > 107 emit drawVectorLayer(uri,txtLayerName->text(),"delimitedtext");
> > >
> > > http://svn.qgis.org/trac/browser/trunk/qgis/src/plugins/delimited_text/qgsdelimitedtextplugin.cpp
> > > 131 void QgsDelimitedTextPlugin::drawVectorLayer(QString thePathNameQString,
> > > 132 QString theBaseNameQString, QString theProviderQString)
> > > 133 {
> > > 134 qGisInterface->addVectorLayer( thePathNameQString,
> > > 135 theBaseNameQString, theProviderQString);
> > > 136 }
> > >
> > > From there things get a bit tricky because addVectorLayer returns bool
> > > so you dont at that point have a handle for the actual layer. So next
> > > you need to trawl the registry and find your layer from the layers
> > > map:
> > >
> > > QMap<QString, QgsMapLayer*> myMapLayers =
> > > QgsMapLayerRegistry::instance()->mapLayers();
> > > QMap<QString, QgsMapLayer*>::const_iterator myIterator;
> > > QgsMapLayer * mypLayer;
> > > while (myIterator.hasNext())
> > > {
> > > mypLayer = myIterator.value();
> > > if (mypLayer->source() == theFileNameYouUsedToLoadTheLayer)
> > > {
> > > //layer is found
> > > break;
> > > }
> > > }
> > >
> > > Now you can cast the layer to a vector layer:
> > >
> > > QgsVectorLayer *mypVectorLayer =
> > > dynamic_cast<QgsVectorLayer *> ( mypLayer );
> > > if ( mypVectorLayer )
> > > {
> > > const QgsRenderer* mypRenderer = mypVectorLayer->renderer();
> > > //now set symbology etc...
> > > }
> > >
> > >
> > > Writing this makes me wonder if we shouldnt make addVectorLayer return
> > > the registry layer id, but the above describes how you can achieve
> > > your desired result.
> > >
> > > Hope that helps!
> > >
> > > Regards
> > >
> > > Tim
> > >
> > >
> > >
> > >
> > > 2008/1/23, Ken Roser <kroser at roser.us>:
> > >
> > >> Sorry if I wasn't too clear. Let me try to present the problem just a
> > >> bit differently.
> > >>
> > >> Let's say I'm using the delimited text plugin and provider, as is, in
> > >> the source code, but I want to modify it so that the points are
> > >> displayed as triangles instead of squares and at size 20 instead of the
> > >> default. These choices would be built into the software, i.e., not user
> > >> selectable. How would I do that?
> > >>
> > >> Tim Sutton wrote:
> > >>
> > >>> Hi Ken
> > >>>
> > >>> I'm not sure that it makes sense to set symbology in your provider
> > >>> itself so Im hoping you are trying to do it from some kind of add
> > >>> layer gui, but you havent provided much information for me to know
> > >>> whats really going on. That said here is how you can set the symbol on
> > >>> a new vector layer instance programmatically:
> > >>>
> > >>> 1572 QgsSymbol * mypSymbol = new
> > >>> QgsSymbol(mypVectorLayer->vectorType());
> > >>> 1573 QColor
> > >>> myPresenceColor(mySettings.value("mapping/presenceColour",QColor(Qt::green).name()).toString());
> > >>> 1574 mypSymbol->setFillColor(myPresenceColor);
> > >>> 1575 mypSymbol->setColor(Qt::black); //outline
> > >>> 1576 mypSymbol->setPointSize(mySymbolSize);
> > >>> 1577 mypSymbol->setFillStyle(Qt::SolidPattern);
> > >>> 1578 QgsSingleSymbolRenderer *mypRenderer = new
> > >>> QgsSingleSymbolRenderer(mypVectorLayer->vectorType());
> > >>> 1579 mypRenderer->addSymbol(mypSymbol);
> > >>> 1580 mypVectorLayer->setRenderer(mypRenderer);
> > >>>
> > >>> The above is a single symbol renderer take from one of my cpp
> > >>> projects. The same project also implements a unigue value renderer -
> > >>> see the original source at http://tinyurl.com/3xystm for more info.
> > >>>
> > >>> I hope that helped!
> > >>>
> > >>> Regards
> > >>>
> > >>> Tim
> > >>>
> > >>> 2008/1/23, Ken Roser <kroser at roser.us>:
> > >>>
> > >>>
> > >>>> I'm writing a plugin/provider that's similar in functionality to the
> > >>>> delimited text plug in. Things are working well, but I need to change
> > >>>> the size, color and possibly the symbol itself when I add a point to the
> > >>>> map. I've been unable to determine a method of doing so other than
> > >>>> going to the symbology tab on the layer properties dialog. I want the
> > >>>> change to happen automatically via the provider code. Can anyone help out?
> > >>>> _______________________________________________
> > >>>> Qgis-developer mailing list
> > >>>> Qgis-developer at lists.qgis.org
> > >>>> http://lists.qgis.org/cgi-bin/mailman/listinfo/qgis-developer
> > >>>>
> > >>>>
> > >>>>
> > >>>
> > >>>
> > >>
> > >
> > >
> > >
> >
> >
>
>
> --
> Tim Sutton
> QGIS Project Steering Committee Member - Release Manager
> Visit http://qgis.org for a great open source GIS
> openModeller Desktop Developer
> Visit http://openModeller.sf.net for a great open source ecological
> niche modelling tool
> Home Page: http://tim.linfiniti.com
> Skype: timlinux
> Irc: timlinux on #qgis at freenode.net
>
--
Tim Sutton
QGIS Project Steering Committee Member - Release Manager
Visit http://qgis.org for a great open source GIS
openModeller Desktop Developer
Visit http://openModeller.sf.net for a great open source ecological
niche modelling tool
Home Page: http://tim.linfiniti.com
Skype: timlinux
Irc: timlinux on #qgis at freenode.net
More information about the Qgis-developer
mailing list