[Qgis-developer] Need help with Plugin button behavior connected to SIGNAL("selectionChanged()")

Nathan Woodrow madmanwoo at gmail.com
Thu Aug 22 08:36:28 PDT 2013


Hey Alexandre,

Just a refectoring mistake. I noticed that selectionChanged passes a layer
then forgot that you are connecting other signals which don't.

You get that type error if the self.toggle is not connected to any signals,
you can just wrap it in a try block.
On 23/08/2013 1:29 AM, "Alexandre Neto" <senhor.neto at gmail.com> wrote:

> Hello Nathan,
>
> After I resolved my problem with Denis suggestion I tried to apply your
> refactor to use the new style. The code seems much simpler. But I got two
> errors while running it (see code below).
>
> If I add 'layer' as an argument for the toggle function, I get the
> following error. It works without the change, can you please explain why
> should layer be passed as an argument too?
>
> An error has occured while executing Python code:
>> TypeError: toggle() takes exactly 2 arguments (1 given)
>> Python version:
>> 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)]
>> Traceback (most recent call last):
>>   File
>> "C:\Users\alexandre.neto/.qgis2/python/plugins\splitmultipart\splitmultipart.py",
>> line 84, in toggle
>>     layer.editingStopped.disconnect(self.toggle)
>> TypeError: 'instancemethod' object is not connected
>>
>
> Also, trying to use,
>
> layer.editingStopped.disconnect(self.toggle)
>
>
> instead of,
>
> QObject.disconnect(layer,SIGNAL("editingStopped()"),self.toggle)
>
>
> Gives me this other error:
>
> An error has occured while executing Python code:
>> Traceback (most recent call last):
>>   File
>> "C:\Users\alexandre.neto/.qgis2/python/plugins\splitmultipart\splitmultipart.py",
>> line 83, in toggle
>>     layer.editingStopped.disconnect(self.toggle)
>> TypeError: 'instancemethod' object is not connected
>> Python version:
>> 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)]
>>
>
> Thank you very much for your help,
>
> Alexandre Neto
>
>
> The new code would be:
>
>     def initGui(self):
>>         # Create action that will start plugin configuration
>>         self.action = QAction(
>>             QIcon(":/plugins/splitmultipart/icon.svg"),
>>             QCoreApplication.translate('Multipart split', u"Split
>> Selected Multipart features"), self.iface.mainWindow())
>>         self.action.setEnabled(False)
>>
>>         # connect to signals for button behavior
>>         self.action.triggered.connect(self.run)
>>         self.iface.currentLayerChanged.connect(self.toggle)
>>         self.canvas.selectionChanged.connect(self.toggle)
>>         # Add toolbar button and menu item
>>         self.iface.advancedDigitizeToolBar().addAction(self.action)
>>         self.iface.editMenu().addAction(self.action)
>>
>>     def toggle(self):
>>         layer = self.canvas.currentLayer()
>>
>>         # Decide whether the plugin button is enable or disable
>>         if layer:
>>             # set enable
>>             if layer.isEditable() and layer.selectedFeatureCount() > 0:
>>                 self.action.setEnabled(True)
>>                 layer.editingStopped.connect(self.toggle)
>>                 layer.editingStarted.disconnect(self.toggle)
>>             # set disable
>>             else:
>>                 self.action.setEnabled(False)
>>                 layer.editingStarted.connect(self.toggle)
>>                 layer.editingStopped.disconnect(self.toggle)
>>
>
>
>
> On Thu, Aug 22, 2013 at 1:29 PM, Nathan Woodrow <madmanwoo at gmail.com>wrote:
>
>> This is not going to solve you problem yet but this is a quick refactor
>> to use the new style signal slot syntax:
>>
>> def initGui(self):
>>         # Create action that will start plugin configuration
>>         self.action = QAction(
>>             QIcon(":/plugins/splitmultipart/icon.svg"),
>>             QCoreApplication.translate('Multipart split', u"Split
>> Selected Multipart features"), self.iface.mainWindow())
>>         self.action.setEnabled(False)
>>
>>         # connect to signals for button behavior
>>         self.action.triggered.connect(self.run)
>>         self.iface.currentLayerChanged.connect(self.toggle)
>>
>>         # Add toolbar button and menu item
>>         self.iface.advancedDigitizeToolBar().addAction(self.action)
>>         self.iface.editMenu().addAction(self.action)
>>
>>     def toggle(self, layer):
>>         mc = self.canvas
>>         layer = mc.currentLayer()
>>
>>         # Decide whether the plugin button is enable or disable
>>         if layer:
>>             # set enable
>>             if layer.isEditable():
>>                 layer.editingStopped.connect(self.toggle)
>>                 layer.editingStarted.disconnect(self.toggle)
>>                  layer.selectionChanged.connect(self.toggle)
>>
>>                 self.iface.messageBar().pushMessage("Debug"," Connect
>> SIGNAL(selectionChanged()",0)
>>                 if layer.selectedFeatureCount() > 0:
>>                     self.action.setEnabled(True)
>>                 else:
>>                     self.action.setEnabled(False)
>>             # set disable
>>             else:
>>                  self.action.setEnabled(False)
>>                 layer.editingStarted.connect(self.toggle)
>>                 layer.editingStopped.disconnect(self.toggle)
>>                 layer.selectionChanged.disconnect(self.toggle)
>>                  self.iface.messageBar().pushMessage("Debug","
>> Disconnect SIGNAL(selectionChanged()",0)
>>
>>
>> On Thu, Aug 22, 2013 at 10:11 PM, Alexandre Neto <senhor.neto at gmail.com>wrote:
>>
>>> Hello all,
>>>
>>> I'm updating the Multipart split plugin<http://plugins.qgis.org/plugins/splitmultipart/> to
>>> make it work with the 2.0 API.
>>>
>>> Has I have successfully updated the plugin to make it work in 2.0, I
>>> would like to improve it's button behavior to work like the rest of the
>>> advanced editing toolbar. I am able to enable and disable it if the current
>>> layer is editable.
>>>
>>> Now I'm trying to get the same behavior if there are selected features.
>>> I have made it work, but QGIS starts to get really slow... I found out
>>> that's because lots of connections are being created to
>>> SIGNAL("selectionChanged()").
>>>
>>> Can someone please, point me in the right direction, or tell me where
>>> can I find some code example doing this?
>>>
>>> Thank you very much,
>>>
>>> Alexandre Neto
>>>
>>> Part of the code bellow:
>>>
>>> def initGui(self):
>>>         # Create action that will start plugin configuration
>>>         self.action = QAction(
>>>             QIcon(":/plugins/splitmultipart/icon.svg"),
>>>             QCoreApplication.translate('Multipart split', u"Split
>>> Selected Multipart features"), self.iface.mainWindow())
>>>         self.action.setEnabled(False)
>>>
>>>         # connect to signals for button behavior
>>>         QObject.connect(self.action, SIGNAL("triggered()"), self.run)
>>>         QObject.connect(self.iface,
>>> SIGNAL("currentLayerChanged(QgsMapLayer*)"), self.toggle)
>>>         #QObject.connect(self.iface,
>>> SIGNAL("selectionChanged(QgsMapLayer *)"), self.toggle)
>>>
>>>         # Add toolbar button and menu item
>>>         self.iface.advancedDigitizeToolBar().addAction(self.action)
>>>         self.iface.editMenu().addAction(self.action)
>>>
>>>     def toggle(self):
>>>         mc = self.canvas
>>>         layer = mc.currentLayer()
>>>
>>>         # Decide whether the plugin button is enable or disable
>>>         if layer <> None:
>>>             # set enable
>>>             if layer.isEditable():
>>>
>>> QObject.connect(layer,SIGNAL("editingStopped()"),self.toggle)
>>>                  QObject.connect(layer, SIGNAL("selectionChanged()"),
>>> self.toggle)
>>>
>>> QObject.disconnect(layer,SIGNAL("editingStarted()"),self.toggle)
>>>                 self.iface.messageBar().pushMessage("Debug"," Connect
>>> SIGNAL(selectionChanged()",0)
>>>                 if layer.selectedFeatureCount() > 0:
>>>                     self.action.setEnabled(True)
>>>                 else:
>>>                     self.action.setEnabled(False)
>>>
>>>             # set disable
>>>             else:
>>>                 self.action.setEnabled(False)
>>>
>>> QObject.connect(layer,SIGNAL("editingStarted()"),self.toggle)
>>>
>>> QObject.disconnect(layer,SIGNAL("editingStopped()"),self.toggle)
>>>                 QObject.disconnect(layer, SIGNAL("selectionChanged()"),
>>> self.toggle)
>>>                 self.iface.messageBar().pushMessage("Debug"," Disconnect
>>> SIGNAL(selectionChanged()",0)
>>>
>>> _______________________________________________
>>> Qgis-developer mailing list
>>> Qgis-developer at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20130823/c6572adb/attachment-0001.html>


More information about the Qgis-developer mailing list