[PyQt] pyQT -python beginner question - combo box signal function call

karsten vennemann karsten at terragis.net
Sat Apr 23 03:19:21 BST 2011


Thanks for all the input I received 

I found one seemingly good solution (via internet search) that works using
functools.partial  that is available since python 2.5
http://docs.python.org/library/functools.html#functools.partial

My code is then
...
from functools import partial
...

QObject.connect(comboBoxNew[dropbox_counter],SIGNAL("currentIndexChanged(QSt
ring)"),partial(self.changeValue, x = dropbox_counter))

    def changeValue(self, value, x):                  
        mc = self.canvas                              
        layer = mc.currentLayer()                     
        ob = layer.selectedFeaturesIds()              
        layer.changeAttributeValue(int(ob[0]),x,value)

Hopefully that helps someone else too when trying to easily pass an
additional parameter  from an QT signal slot ...

Karsten 

_______________________

From: C. B. Esquire [mailto:crackerbunny at gmail.com] 
Sent: Friday, April 22, 2011 18:51
To: karsten vennemann
Subject: Re: [PyQt] pyQT -python beginner question - combo box signal
function call



	Perhaps use the currentIndex() method on the combobox inside your
changeValue function ...
	
	def changeValue(self, value):
	    mc = self.canvas
	    layer = mc.currentLayer()
	    obj= layer.selectedFeatureIds()
	    layer.changeAttributeValue(int(obj[0],
yourComboBox.currentIndex(), value)
	
	
	You can also use a not very highly recommend way, with lambda,
however it sucks for garbage cleanup, it's sloppy python,and you will no
longer get your QString passed.... off the top of my head it would be
something like ....
	
	
QObject.connect(comboBoxNew[dropbox_counter],SIGNAL("currentIndexChanged(QSt
ring)"), lambda: self.changeValue(self, dropbox_counter))
	
	
	
	
	On Fri, Apr 22, 2011 at 8:07 PM, karsten vennemann
<karsten at terragis.net> wrote:
	

		I have a dynamic data entry from to which I am adding combo
boxes on he fly using lists
		 
		  # here I add labels and combo boxes to the form from a
list ..
	
self.dlg.ui.streamEditCustomFormLayout.addWidget(comboBoxNewLabel[dropbox_co
unter])
	
self.dlg.ui.streamEditCustomFormLayout.addWidget(comboBoxNew[dropbox_counter
])
		
		# and then add a signal to trigger updating of the attribute
in a table with the value selected in the combo box via the changeValue
function
	
QObject.connect(comboBoxNew[dropbox_counter],SIGNAL("currentIndexChanged(QSt
ring)"),self.changeValue)
		
		the function I have works but so is set to change always
attribute column 2 (in bold)
		
		    def changeValue(self, value):
		        mc = self.canvas                  # the map cabavs
uin QGIS
		        layer = mc.currentLayer()      # a layer in QGIS
		        ob = layer.selectedFeaturesIds()   
		        layer.changeAttributeValue(int(ob[0]),2,value)  #
Change value for colum 2 
		 
		How can I add one additional parameter to the function call
form the combo box ?
		 
		 
		Something like
		 
	
QObject.connect(comboBoxNew[dropbox_counter],SIGNAL("currentIndexChanged(QSt
ring)"),self.changeValue(self, dropbox_counter))
		 
		    def changeValue(self, value, colum_id):
		        mc = self.canvas         
		        layer = mc.currentLayer()
		        ob = layer.selectedFeaturesIds()
	
layer.changeAttributeValue(int(ob[0]),colum_id,value)
		 
		 
		but with this I am getting
	
QObject.connect(comboBoxNew[dropbox_counter],SIGNAL("currentIndexChanged(QSt
ring)"),self.changeValue(self, dropbox_counter))
		TypeError: arguments did not match any overloaded call:
		  QObject.connect(QObject, SIGNAL(), QObject, SLOT(),
Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type
'NoneType'
		  QObject.connect(QObject, SIGNAL(), callable,
Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type
'NoneType'
		  QObject.connect(QObject, SIGNAL(), SLOT(),
Qt.ConnectionType=Qt.AutoConnection): argument 2 has unexpected type 'str'
				 
		How can this be done correctly ?
		Karsten

		_______________________________________________
		PyQt mailing list    PyQt at riverbankcomputing.com
		http://www.riverbankcomputing.com/mailman/listinfo/pyqt
		





More information about the PyQt mailing list