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

Alexandre Neto senhor.neto at gmail.com
Thu Aug 22 08:29:26 PDT 2013


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/20130822/78194e18/attachment.html>


More information about the Qgis-developer mailing list