Re: [QGIS-Developer] Replacing a dialogue with another at runtime with Python
Hi Dennis On Tue, Oct 3, 2017 at 3:21 PM, Denis Rouzaud wrote: > Hi Ricardo, > > Sorry to bother, but I think this kind of hack should be discouraged. > No bother at all :) I am just playing around with some ideas for improving the WMS layer support. The whole 'hijack QGIS native dialog' thing is just a sidetrack that is not really my main goal. It just seemed like a wacky, fun idea to try out. just to see if it is possible! > > 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 > That might be the plan for the long run. For now I'm just having some fun at lunch break ;) > * 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. > Yeah I am aware there is a proper way to do this, and this is not it. This is just toying and poking at stuff to see what is possible. On a more "serious" tone, I agree with you 100%. This is not something that I'd be putting out there for the world to use. > > Just my two cents. > > Denis > > Cheers > > > > > Le mar. 3 oct. 2017 à 16:09, Ricardo Filipe Soares Garcia da < > ricardo.garcia.si...@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.si...@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@lists.osgeo.org >> List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer >> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer > > -- ___ ___ __ Ricardo Garcia Silva ___ QGIS-Developer mailing list QGIS-Developer@lists.osgeo.org List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
Re: [QGIS-Developer] Replacing a dialogue with another at runtime with Python
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.si...@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.si...@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@lists.osgeo.org > List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer > Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer ___ QGIS-Developer mailing list QGIS-Developer@lists.osgeo.org List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
Re: [QGIS-Developer] Replacing a dialogue with another at runtime with Python
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.si...@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@lists.osgeo.org List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
[QGIS-Developer] Replacing a dialogue with another at runtime with Python
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 ___ QGIS-Developer mailing list QGIS-Developer@lists.osgeo.org List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer