<div dir="ltr">Actually it seems the <span style="background-color:rgb(238,238,238)"><font face="monospace, monospace">layer.setDataSource()</font></span> method works, sorry for the noise !<div><br><div>But then it resets the style of the layer to default (uniform random color), as if the layer was freshly added...</div><div><br></div><div>I tried this :</div><div><br></div><div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)"># get values</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">oldRenderer = layer.rendererV2().clone()</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">oldDataSource = layer.dataProvider().dataSourceUri()</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">newDataSource = re.sub('\/\*\*\/[0-9.]*\/\*\*\/','/**/'+str(buffer)+'/**/',oldDataSource)</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)"><br></font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)"># set values</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">layer.setDataSource( newDataSource, <a href="http://layer.name" target="_blank">layer.name</a>(), layer.dataProvider().name() )</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">layer.setRendererV2( oldRenderer  )</font></div></div><div><br></div><div>But it crashes because of the last line, when setting the rendererV2.</div><div><br></div><div>This workaround works :</div><div><br></div><div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)"># get values</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">oldRendererXML = layer.rendererV2().save( QDomDocument() )</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">oldDataSource = layer.dataProvider().dataSourceUri()</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">newDataSource = re.sub('\/\*\*\/[0-9.]*\/\*\*\/','/**/'+str(date)+'/**/',oldDataSource)</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)"><br></font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)"># set values</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">layer.setDataSource( newDataSource, <a href="http://layer.name" target="_blank">layer.name</a>(), layer.dataProvider().name() )</font></div><div><font face="monospace, monospace" style="background-color:rgb(238,238,238)">layer.setRendererV2( QgsFeatureRendererV2.load(oldRendererXML) )</font></div></div><div><br></div><div><br></div><div>The whole thing is slow though when compared to <font face="monospace, monospace" style="background-color:rgb(238,238,238)">layer.setSubsetString(...)</font>, not allowing for nice realtime feedback for the user.</div></div><div>From looking into the source, it seems the <span style="background-color:rgb(238,238,238)"><font face="monospace, monospace">QgsVectorLayer::setDataSource</font></span> method considers the layer is freshly added: it resets the CRS, it creates/loads a rendererV2, it sets the legend, and it connects some signals, all of which probably explains why it's so slow.</div><div><br></div><div>Would it be possible to change that method to to update the dataSource of an existing layer ? Or to add a changeDataSource(...) method ?</div><div><br></div><div>Thanks !</div><div><br></div><div>Olivier</div><div><br></div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">2015-06-17 14:29 GMT+02:00 Olivier Dalang <span dir="ltr"><<a href="mailto:olivier.dalang@gmail.com" target="_blank">olivier.dalang@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">Hi !</p>
<p dir="ltr">Is it possible to change the query of a postgis query layer in python without reloading the project ?</p>
<p dir="ltr">The goal is to have a parameter in my query that I'd be able to change with a slider.</p>
<p dir="ltr">I tried the QgsVectorLayer.setDataSource() method, but it makes QGis crash.<br>
I tried the workaround described here (<a href="http://gis.stackexchange.com/questions/62610/changing-data-source-of-layer-in-qgis" target="_blank"> http://gis.stackexchange.com/questions/62610/changing-data-source-of-layer-in-qgis</a> ), writing and reading the XML file, but it also makes QGis crash.</p>
<p dir="ltr">If not possible, is there a serious limitation behind this, or is the feature just missing/bugged ?<br><br></p>
<p dir="ltr">Example :</p>
<p dir="ltr">I have this query loaded as a layer:</p>
<p dir="ltr">"SELECT id, name, ST_Buffer(geom,25) as geom FROM my_table"</p>
<p dir="ltr">But I want to be able to change the hardcoded buffer from 25 to some value from a QSlider.<br><br></p>
<p dir="ltr">Thanks!</p><span><font color="#888888">
<p dir="ltr">Olivier </p>
</font></span></blockquote></div><br></div></div>