2010-10-19 6 views
7

Sto usando PyQt4, ma questo è abbastanza generale da poter essere applicato solo a QT.PyQt (o solo QT). Come ottenere QComboBox per attivare un segnale ogni volta che è impostato su un valore (anche se invariato)

ho una serie di QComboBoxes che riempio da sinistra a destra (ad esempio la selezione di un elemento in più a sinistra popolerà il prossimo. La selezione di un elemento in quella popoleranno il successivo, e così via)

Sto avendo difficoltà a far scattare i miei segnali in tutte le situazioni (cioè indipendentemente dal fatto che l'indice corrente cambi o meno E indipendentemente dal fatto che l'elemento sia impostato dall'utente o impostato programmaticamente).

Più particolare:

mi baso sui segnali del primo QCombox a fuoco ogni volta che un elemento è selezionato in modo che possa popolare il prossimo QCombobox nella GUI. Allora mi affido a THAT QCombobox per emettere un segnale in modo da poter popolare quello successivo. E così via.

Desidero preselezionare un elemento in ogni QCombobox in base all'interazione dell'utente con l'interfaccia utente.

Ho una funzione univoca per QCombobox che è responsabile per la compilazione e la preselezione di solo QCombobox. Il codice simile a questa:

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

dove intLastSavedState1 è un numero intero che deriva dal testo che è stato selezionato dall'utente l'ultima volta che avevano usato l'applicazione scorso. Speravo che l'ultima riga di questa funzione avrebbe generato un segnale che avrebbe causato il caricamento della funzione della casella combinata successiva e la preselezione di un elemento (comboBox2). E quell'azione causerebbe quindi la successiva funzione comboBox's da attivare e passerebbe al successivo e al successivo. Ma non sta funzionando in tutti i casi.

Ho provato due versioni dei segnali:

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

e

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

Nel primo caso, il segnale sarà fuoco solo se il intLastSavedState1 è diverso da tutto ciò che è correntemente selezionato nella casella combinata. Ciò causa un problema se l'utente ha selezionato l'ultimo elemento 0 da quella lista. In questo caso, QT non riconosce il mio script impostando l'indice corrente su 0 come una modifica (poiché dopo aver caricato la casella sembra che sia già sull'indice 0), e quindi il segnale non si attiva.

Nel secondo caso, il segnale scatterà indipendentemente da ciò che è attualmente selezionato nella casella combinata ... ma solo se attivato dall'utente. Non si attiva quando il mio script tenta di impostare l'indice corrente in modo programmatico.

Queste sembrano essere le mie uniche due opzioni per quanto riguarda i segnali. Quindi ... c'è un altro modo di preselezionare gli articoli in uno QCombobox che attiverà un segnale ogni volta?

risposta

7

Beh ... a volte solo l'atto di porre una domanda può portare a una risposta (parziale).

Ho una soluzione, ma sono ancora interessato a sentire se qualcuno ha un'idea migliore.

Ora sto impostando l'indice dello QCombobox su -1 immediatamente dopo averlo caricato. Poi, quando ho programatically impostare l'indice effettivo basato sulla storia dell'utente, sarà sempre considerato un cambiamento (vale a dire che non sarà mai -1) e il segnale sparerà

utilizzando: currentIndexChanged(const QString&)

Quindi il mio codice assomiglia a questo ora:

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

e il mio segnale si presenta in questo modo:

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

questo funziona ... qualcuno ha un'idea migliore?

Grazie.

+0

Mi sembra ragionevole se funzioni. Questo metodo di concatenamento per il ripristino dello stato precedente offre un vantaggio rispetto all'utilizzo di un'unica routine di ripristino che blocca i segnali mentre si ripristinano tutti e tre contemporaneamente? –

+0

Non riesco a ripristinare tutti e tre poiché il contenuto di # 2 dipende da cosa è stato selezionato per # 1. E i contenuti del # 3 possono essere determinati solo in base a ciò che è stato selezionato per il # 2, ecc ... – bvz

+0

Lo stesso problema per me. Ma la dichiarazione sopra ha funzionato bene quando l'ho implementata in un QWidget ma quando ho codificato in QMainWindow, i valori di ComboBox non attivano nulla .... – vettipayyan