2009-02-05 17 views
5

Estoy mostrando un menú emergente para seleccionar algunos valores en un QTableWidget. El elemento más bajo es una entrada de "Modificar lista", cuando lo selecciono, una nueva ventana debería aparecer automáticamente y el QComboBox debería desaparecer y la celda volver al estado Qt :: DisplayRole.¿Cómo puedo decirle a QTableWidget que termine de editar una celda?

Ahora Qt tiene todas esas bonitas API-llamadas como QTableWidget.edit() y QTableWidget.editItem(), lo que realmente estoy buscando es un QTableWidget.endEditing(), preferiblemente sin que especifica el índice de la célula, a pesar de que podría conseguir que el uso de esta llamada:

table.currentIndex() 

... pero no sé si puedo garantizar que la celda actual sea la celda que se está editando en todo momento.

¿Hay una API para cerrar ese tipo de editores?

Popup menu

Respuesta

7

QTableWidget hereda 19 ranuras públicas de QWidget. Uno de ellos es setDisabled(), que debería deshabilitar los eventos de entrada para ese widget y todos sus elementos secundarios.

me gustaría probar:

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

Aunque usted ha dicho que no funciona para usted, no es un método alternativo: Si no te gusta que (la tabla pierde el foco, creo), que puede intentar usar EditTriggers. Por ejemplo:

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

Su el primero funcionó, el segundo no. No importa que pierda enfoque porque muestro un diálogo modal. Marcaré esta respuesta como correcta si nadie va a proponer una solución más natural. –

+0

Acabo de encender un ejemplo para probar EditTriggers y parece que funciona (C++, Qt 4.4.3). Puedo hacer clic en cada celda y tal, pero no puedo hacer doble clic en ellas para editar ni nada. No sé por qué no funciona para ti. * shrug * –

+0

Se trata de cerrar el editor, no poder editarlo. La próxima vez que haga doble clic debería abrir el editor nuevamente. –

1

Usted puede ser capaz de utilizar QTableWidget.closePersistentEditor() para cerrar el editor. Sin embargo, QAbstractItemView.closeEditor() puede estar más cerca de lo que desea, especialmente porque parece que se siente cómodo con la API basada en QModelIndex y ya está utilizando un widget de editor personalizado.

2

table.setCurrentItem(None) es lo que funcionó para mí. (No olvide bloquear las señales si usa alguna función de ranura cellChanged/itemChanged.)

Esto es con PyQt. Para C++ creo que reemplazar ninguno con NULL.

0

No puedo hablar de widgets de listas. Pero, llegué aquí tratando de hacer algo similar.

Estaba haciendo doble clic en una celda, y en función de la columna, aparece un subformulario con una lista, y cuando se cerró, vaya a la siguiente columna adecuada en función del valor seleccionado.

Mi problema fue que pude obtener el valor en la celda y "seleccionar" la siguiente celda apropiada, pero la celda original permaneció seleccionada en el modo de edición.

Finalmente me di cuenta de que mi doble clic estaba seleccionando la celda, es decir. edición.

Un solo clic selecciona la celda pero no abre un modo de edición.

nota

lateral: Nunca podría conseguir que la sub-forma de actuar verdaderamente modal, así que creé un bucle en forma de llamada: mientras que la forma de sub era visible, con el único código que se está app.processEvents()

Cuestiones relacionadas