Aparte de interacción con el usuario de programmical cambio: PyQt, QComboBox

Tengo varios QComboBoxes en mi PyQt4/Python3 GUI y están llenos de algunas entradas de una base de datos durante la inicialización. Inicial CurrentIndex se establece en 0. También hay una casilla que cambia el idioma de los elementos en mis cuadros combinados. Para preservar la actual selección de usuario backup de índice del elemento actual y setCurrentIndex a este número después de haber llenado en el ComboBox con traducida elementos. Todas aquellas acciones que se emiten currentIndexChanged de la señal.

Basa en los artículos seleccionados en QComboBoxes algunos trama se muestra. La idea es volver a dibujar el gráco en línea – tan pronto como el usuario los cambios de cualquiera de ComboBox elemento actual. Y aquí tengo un problema ya que si yo dibujar la trama cada vez que la señal de currentIndexChanged es emitido, yo redibujar también varias veces durante la inicialización y si la traducción marque la casilla de selección fue cambiado.

¿Cuál es la mejor manera de separar estos casos? En principio necesito para separar programmical actual Índice de Cambio del usuario, y la actualización de la trama sólo en el caso posterior (durante la GUI de inicialización puedo programically llamada de actualización de la función plot de una vez). Debo de escritura/reescritura de cualquier señal? Si es así, yo nunca lo hice antes, y daría la bienvenida a cualquier sugerencia o un buen ejemplo. El uso de otra señal? O tal vez hay una manera temporal bloquear todas las señales?

InformationsquelleAutor Katya | 2012-02-08

1 Kommentar

  1. 10

    Hay un par de cosas diferentes que usted puede intentar.

    En primer lugar, asegúrese de que usted haga todas sus inicialización antes de de conectar las señales.

    En segundo lugar, se podría utilizar el activado de la señal, que sólo se envía cuando el usuario selecciona un elemento. (Pero tenga en cuenta que, a diferencia de currentIndexChanged, esta señal es enviada incluso si el índice no ha cambiado).

    En tercer lugar, puede utilizar blockSignals para detener temporalmente a cualquier señal que se envía, mientras que el índice actual es ser cambiado mediante programación.

    Aquí una secuencia de comandos que muestra estas posibilidades:

    from PyQt4 import QtGui, QtCore
    
    class Window(QtGui.QWidget):
        def __init__(self):
            QtGui.QWidget.__init__(self)
            layout = QtGui.QVBoxLayout(self)
            self.combo = QtGui.QComboBox()
            self.combo.setEditable(True)
            self.combo.addItems('One Two Three Four Five'.split())
            self.buttonOne = QtGui.QPushButton('Change (Default)', self)
            self.buttonOne.clicked.connect(self.handleButtonOne)
            self.buttonTwo = QtGui.QPushButton('Change (Blocked)', self)
            self.buttonTwo.clicked.connect(self.handleButtonTwo)
            layout.addWidget(self.combo)
            layout.addWidget(self.buttonOne)
            layout.addWidget(self.buttonTwo)
            self.changeIndex()
            self.combo.activated['QString'].connect(self.handleActivated)
            self.combo.currentIndexChanged['QString'].connect(self.handleChanged)
            self.changeIndex()
    
        def handleButtonOne(self):
            self.changeIndex()
    
        def handleButtonTwo(self):
            self.combo.blockSignals(True)
            self.changeIndex()
            self.combo.blockSignals(False)
    
        def changeIndex(self):
            index = self.combo.currentIndex()
            if index < self.combo.count() - 1:
                self.combo.setCurrentIndex(index + 1)
            else:
                self.combo.setCurrentIndex(0)
    
        def handleActivated(self, text):
            print('handleActivated: %s' % text)
    
        def handleChanged(self, text):
            print('handleChanged: %s' % text)
    
    if __name__ == '__main__':
    
        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.show()
        sys.exit(app.exec_())
    • Muchas gracias por una buena ilustración! Tomé la blockSignals solución. Por CIERTO, es que realmente posible «asegúrese de que usted haga todas sus inicialización antes de conectar las señales» si puedo usar QT designer y no un programa de diseño, como en el ejemplo? Momento en el cual se activan las señales?
    • Con Qt Designer, que sólo se puede conectar pre-existente señales de pre-ranuras existentes (como opuesto a sus propios controladores). Así, en la práctica, casi todas las señales deberá conectado después la interfaz gráfica de usuario ha sido creado (a menos que la aplicación es muy simple). Personalmente, yo sólo uso de Qt Designer para diseñar la interfaz gráfica de usuario, y sólo muy rara vez se utilizan para la conexión de señales.
    • Activa trabaja para mí en Python3 con PySide2

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea