PyQt (o simplemente QT). Como llegar QComboBox para disparar una señal cada vez que se establece en un valor (incluso si no es modificada)

StackOverflow https://stackoverflow.com/questions/3965093

  •  09-10-2019
  •  | 
  •  

Pregunta

Estoy utilizando PyQt4, pero esto es bastante general de que sólo podría aplicarse a QT.

Tengo una serie de QComboBoxes que me llenan de izquierda a derecha (es decir, la selección de un elemento de la izquierda se rellenará el siguiente. Al seleccionar un elemento en el que se va a rellenar el siguiente, y así sucesivamente)

Tengo dificultades para conseguir mis señales de fuego en todas las situaciones (es decir, independientemente de si los cambios del índice actuales o no, y sin importar si el elemento está ajustado por el usuario o configurar mediante programación).

Más detalles:

Me baso en las señales del primer QCombox a fuego cada vez que se selecciona un elemento para que pueda llenar el siguiente QCombobox en la GUI. entonces confiar en ese QCombobox para emitir una señal para que pueda llenar el siguiente. Y así sucesivamente.

Quiero pre-seleccionar un elemento en cada QCombobox basado en última interacción del usuario con la interfaz gráfica de usuario.

I tiene una función única por QCombobox que se encarga de poblar y pre-seleccionar sólo que QCombobox. La apariencia del código de algo como esto:

comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)

donde intLastSavedState1 es un número entero que se deriva de la texto que fue la última seleccionada por el usuario la última vez que habían utilizado la aplicación. Tenía la esperanza de que la última línea de esta función dispararía una señal que haría que la siguiente función de cuadro combinado de carga y pre-seleccionar un elemento (comboBox2). Y que la acción provocaría entonces la siguiente función para activar comboBox's y sería en cascada a la siguiente y la siguiente. Pero no está trabajando en todos los casos.

I han intentado dos versiones de las señales:

self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)

y

self.connect(comboBox1, QtCore.SIGNAL("activated(const QString&)"), self.load_comboBox2)

En el primer caso, la señal se activará sólo si el intLastSavedState1 es diferente a lo que está actualmente seleccionado en el cuadro combinado. Esto causa un problema si el usuario ha seleccionado la última unidad 0 de esa lista. En este caso QT no reconoce la escritura de establecer el índice actual a 0 como un cambio (ya que después de cargar la caja en la que parece pensar que ya está en el índice 0), por lo que la señal no se dispara.

En el segundo caso, la señal se disparará independientemente de lo que está actualmente seleccionado en el cuadro combinado ... pero sólo si se ha activado por el usuario. Que no se disparará cuando mis intentos de secuencia de comandos para establecer el índice actual mediante programación.

Estos parecen ser mis únicas dos opciones con respecto a las señales. Así que ... ¿hay otra forma de artículo en la preselección de un QCombobox que activará una señal cada vez?

¿Fue útil?

Solución

Bueno ... a veces sólo el acto de hacer una pregunta que puede conducir a una respuesta (parcial).

Tengo un trabajo en torno pero todavía estoy interesado en escuchar si alguien tiene una idea mejor.

Ahora estoy poniendo programáticamente el índice de la QCombobox a -1 inmediatamente después de cargar para arriba. Entonces, cuando me puse programáticamente el índice real basado en la historia del usuario, siempre será considerado como un cambio (es decir, que nunca será -1) y la señal se disparará

usando: currentIndexChanged(const QString&)

Así que mi código es el siguiente ahora:

comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.setCurrentIndex(-1)
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)

y mi señal es similar al siguiente:

self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)

Esto funciona ... ¿alguien tiene una idea mejor?

Gracias alquilásemos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top