2012-08-10 12 views
5

Utilizando un QComboBox con pyside, sé cómo conectar la señal y usar el índice que envía. Pero ¿qué pasa con el argumento Unicode? Si prefiero conectarme a algo que quiera la secuencia de combobox, ¿es posible?Señales pyside sobrecargadas (QComboBox)

Desde: http://www.pyside.org/docs/pyside/PySide/QtGui/QComboBox.html#PySide.QtGui.QComboBox

existen las tres señales en dos versiones, una con un argumento PySide.QtCore.QString y uno con un argumento int.

Signals

def activated (arg__1) 
def activated (index) 

PySide.QtGui.QComboBox.activated (índice) Parámetros: index - PySide.QtCore.int

PySide.QtGui.QComboBox.activated (arg_ 1) Parámetros : arg _1 - unicode

Edición: algunos códigos.

le = ComboBoxIpPrefix() 
le.currentIndexChanged.connect(lambda x....) 

Este código me da el índice. La pregunta era cómo obtener la cadena Unicode mencionada en los documentos.

Respuesta

12

No entiendo exactamente cuál es su pregunta.

Hay dos versiones de la señal QComboBox.activated. One le da el índice del artículo seleccionado, el other one le da su texto.

que elegir entre ellos en PySide de hacer lo siguiente:

a_combo_box.activated[int].connect(some_callable) 

a_combo_box.activated[str].connect(other_callable) 

La segunda línea probablemente no va a trabajar de esta manera en Python 2, por lo que sustituir str con unicode.

Tenga en cuenta que yo uso general (C++) Qt documentación, porque la documentación PySide sigue siendo bastante ambigua: seguía viendo esos arg__1 s en todas partes ...
"Traducir" para Python no debe ser demasiado duro. Solo tenga en cuenta que QString se convierte en str (o unicode en Python 2; por cierto, me gusta que mi código funcione en todas las versiones de Python, así que generalmente hago un tipo de alias str en Py3 y unicode en Py2); long, short, etc. se convierten en int; double se convierte en float; QVariant se evita por completo, simplemente significa que cualquier tipo de datos se puede pasar allí; y así sucesivamente ...

2

Gracias Oleh Prypin! Tu respuesta me ayudó cuando encontré el arg__1 oscuro en la documentación de PySide.

Cuando probé tanto combo.currentIndexChanged [str] como combo.currentIndexChanged [unicode], cada señal enviaba la versión unicode del texto del índice actual.

He aquí un ejemplo que muestra el comportamiento:

from PySide import QtCore 
from PySide import QtGui 

class myDialog(QtGui.QWidget): 
    def __init__(self, *args, **kwargs): 
     super(myDialog, self).__init__(*args, **kwargs) 

     combo = QtGui.QComboBox() 
     combo.addItem('Dog', 'Dog') 
     combo.addItem('Cat', 'Cat') 

     layout = QtGui.QVBoxLayout() 
     layout.addWidget(combo) 

     self.setLayout(layout) 

     combo.currentIndexChanged[int].connect(self.intChanged) 
     combo.currentIndexChanged[str].connect(self.strChanged) 
     combo.currentIndexChanged[unicode].connect(self.unicodeChanged) 

     combo.setCurrentIndex(1) 

    def intChanged(self, index): 
     print "Combo Index: " 
     print index 
     print type(index) 

    def strChanged(self, value): 
     print "Combo String:" 
     print type(value) 
     print value 

    def unicodeChanged(self, value): 
     print "Combo Unicode String:" 
     print type(value) 
     print value 

if __name__ == "__main__": 

    app = QtGui.QApplication([]) 
    dialog = myDialog() 
    dialog.show() 
    app.exec_() 

La salida resultante es:

Combo Index 
1 
<type 'int'> 
Combo String 
<type 'unicode'> 
Cat 
Combo Unicode String 
<type 'unicode'> 
Cat 

también confirmé que basestring generará un error IndexError: Signature currentIndexChanged(PyObject) not found for signal: currentIndexChanged. PySide parece diferenciar int, float (que se refiere como double), str/unicode (que ambos se convierten en unicode), y bool, pero todos los demás tipos de pitón son interpretados como PyObject con el propósito de firmas de señal.

Espero que ayude a alguien!