[QGIS-Developer] Replacing a dialogue with another at runtime with Python

Denis Rouzaud denis.rouzaud at gmail.com
Tue Oct 3 07:21:15 PDT 2017


Hi Ricardo,

Sorry to bother, but I think this kind of hack should be discouraged.

This modifies QGIS behavior in a hidden way by replacing native dialogs.
And as you pointed, there is probably no way of uninstalling your plugin
properly. It will require QGIS to restart to work as expected, which is not
that bad, but still.

If you think current behavior is not optimal, I would suggest to either:
* bring your improvements into master instead of a plugin
* create a dedicated button and menu entry in your plugin for your
customized dialog

With the latter option, I think it would be possible to add your menu entry
and button in the layer menu and layer toolbar, respectively.

Just my two cents.

Denis





Le mar. 3 oct. 2017 à 16:09, Ricardo Filipe Soares Garcia da <
ricardo.garcia.silva at gmail.com> a écrit :

> Hi all
>
> Answering my own question for posterity
>
> Turns out I can disconnect all slots from a signal by calling
> `my_action.triggered.disconnect()` without any arguments. My goal of
> replacing the native QGIS 'Add WMS/WMTS layer' dialogue with another one
> can be achieved like this:
>
> ```python
>
> def my_handler():
>     print("Hello")
>
> action = iface.actionAddWmsLayer()
> action.triggered.disconnect()
> action.triggered.connect(my_handler)
> ```
>
> This leaves another problem to be solved: How to restore the native QGIS
> dialogue when my would-be plugin is deactivated by the user. The following
> seems to work on QGIS 2.18:
>
> ```
> provider_registry = qgis.core.QgsProviderRegistry.instance()
> add_wms_dialog = provider_registry.selectWidget("wms")
> action.triggered.disconnect()
> action.triggered.connect(add_wms_dialog.show)
>
> ```
>
> Best regards
>
>
>
> On Mon, Oct 2, 2017 at 12:41 PM, Ricardo Filipe Soares Garcia da <
> ricardo.garcia.silva at gmail.com> wrote:
>
>> Hi all
>>
>> Is it possible to replace one of QGIS' dialogues with a custom one during
>> runtime by using Python?
>>
>> My concrete goal is to replace the dialogue that shows when clicking the
>> 'Add WMS/WMTS Layer' with something custom. I'd like to enhance the native
>> QGIS dialogue with additional elements for selecting additional dimensions,
>> like time or elevation.
>>
>> Can this be done?
>>
>> I'm thinking that I'd only have to replace whatever slot is currently
>> defined on the `iface.actionAddWmsLayer()` action with a custom function
>> that would load my UI instead. The problem is that I can't seem to find
>> where a signal's connected slots are stored with Qt.
>>
>> Ideally there would be some introspection mechanism by which I'd be able
>> to retrieve which slots are associated with the action's `triggered` signal
>> - I can't seem to find it though. After knowing which slot(s) were
>> connected to the action's signal, I would presumably be able to
>> `disconnect()` them and then connect my own.
>>
>> By looking at Qt's docs I thought that the QMetaObject class might be the
>> place to look, but I still cannot find anything that looks seems to hold
>> the registry of a signal's connected slots.
>>
>> Thanks in advance :)
>>
>>
>>
>> --
>> ___________________________ ___ __
>> Ricardo Garcia Silva
>>
>
>
>
> --
> ___________________________ ___ __
> Ricardo Garcia Silva
> _______________________________________________
> QGIS-Developer mailing list
> QGIS-Developer at lists.osgeo.org
> List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20171003/cebbaa71/attachment.html>


More information about the QGIS-Developer mailing list