2009-02-05 8 views
5

Sto visualizzando un menu popup per selezionare alcuni valori in un QTableWidget. L'elemento più basso è una voce "Modifica lista", quando lo seleziono una nuova finestra dovrebbe apparire automaticamente e il QComboBox dovrebbe scomparire e la cella tornare a uno stato Qt :: DisplayRole.Come posso dire a un QTableWidget di terminare la modifica di una cella?

Ora Qt ha tutte quelle belle API-chiamate come QTableWidget.edit() e QTableWidget.editItem(), quello che sto veramente cercando è un QTableWidget.endEditing(), preferibilmente senza che specifica l'indice della cella, anche se ho potuto ottenere che l'utilizzo di questa chiamata:

table.currentIndex() 

... ma non so se posso garantire che la cella corrente sia la cella in corso di modifica in ogni momento.

Esiste un'API per chiudere questo tipo di editor?

Popup menu

risposta

7

QTableWidget eredita 19 slot pubbliche da QWidget. Uno di questi è setDisabled(), che dovrebbe disabilitare gli eventi di input per quel widget e tutti i suoi figli.

Vorrei provare:

table.setDisabled(true); 
table.setDisabled(false); 

Anche lei ha detto che non funziona per voi, c'è un metodo alternativo: Se non ti piace che (la tabella non è più attivo, credo), è può provare a utilizzare EditTriggers. Per esempio:

table.setEditTriggers(QAbstractItemView::NoEditTriggers); 
+0

tuo il primo ha funzionato, il secondo no. Non importa che perda messa a fuoco perché mostro una finestra di dialogo modale. Segnerò questa risposta come corretta se nessuno sta per proporre una soluzione più naturale. –

+0

Ho appena fatto un esempio per testare EditTriggers e sembra funzionare (C++, Qt 4.4.3). Posso cliccare su ogni cella e così via, ma non posso fare doppio clic su di essi per modificare o qualcosa del genere. Non so perché non funzioni per te. * shrug * –

+0

Si tratta di chiudere l'editor, non essere in grado di modificarlo. La prossima volta che si fa doppio clic dovrebbe aprire di nuovo l'editor. –

1

Si può essere in grado di utilizzare QTableWidget.closePersistentEditor() per chiudere l'editor. Tuttavia, QAbstractItemView.closeEditor() potrebbe essere più vicino a ciò che si desidera, soprattutto perché sembra che tu stia a tuo agio con l'API basata su QModelIndex e stia già utilizzando un widget di editor personalizzato.

2

table.setCurrentItem(None) è ciò che ha funzionato per me. (Non dimenticare di bloccare i segnali se utilizzi una funzione di cella cellChanged/itemChanged.)

Questo è con PyQt. Per C++ penso sostituisca None con NULL.

0

Non riesco a parlare per i widget di elenco. Ma, sono arrivato qui cercando di fare qualcosa di simile.

Facevo doppio clic su una cella, e in base alla colonna, facendo apparire una sottomodella con un elenco, quindi quando quello era chiuso, passare alla colonna appropriata successiva in base al valore selezionato.

Il mio problema era che potevo ottenere il valore nella cella e "selezionare" la cella appropriata successiva, ma la cella originale è rimasta selezionata in modalità di modifica!

Finalmente mi sono reso conto che il mio doppio clic stava selezionando la cella, es. la modifica.

Un singolo clic seleziona la cella ma non apre una modalità di modifica.

nota

laterale: non avrebbe mai potuto ottenere quel sotto-forma di agire veramente modale, così ho creato un ciclo sotto forma di chiamata: mentre la forma sub era visibile, con l'unico codice in fase di app.processEvents()

Problemi correlati