It worked well! Actually, looking into Bernhard code I have found the same solution (the try block).
Thank you, Nathan, Denis and Bernhard for all your help. Cheers, Alexandre Neto On Thu, Aug 22, 2013 at 4:36 PM, Nathan Woodrow <[email protected]> wrote: > 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" <[email protected]> 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 <[email protected]>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 >>> <[email protected]>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 >>>> [email protected] >>>> http://lists.osgeo.org/mailman/listinfo/qgis-developer >>>> >>>> >>> >>
_______________________________________________ Qgis-developer mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/qgis-developer
