python qt pyqt signals qtablewidget

python - qtablewidgetitem pyqt



QTableWidget signal cellChanged(): distingue entre la entrada del usuario y el cambio por rutinas (3)

Parece que esta es la única señal en QTableWidget al menos para 4.6. Puede publicar una solicitud de función, pero no sé si es aceptada y puede esperar mucho tiempo ;-)

Tal vez podría tratar de escribir una subclase de QTableWidget y emitir señales propias, cuando la celda se cambie internamente.

De todos modos, desconectarse durante el tiempo de actualización de la celda no es tan malo, ya que no se puede conectar a una señal específica.

Estoy usando PyQt pero mi pregunta es una Qt general:

Tengo un QTableWidget que está configurado por la función updateTable. Escribe los datos de DATASET en la tabla cuando se llama. Lamentablemente, esto hace que mi QTableWidget emita la señal cellChanged () para cada celda.

La señal cellChanged () está conectada a una función on_tableWidget_cellChanged que lee los contenidos de la celda modificada y la escribe nuevamente en DATASET. Esto es necesario para permitir al usuario cambiar los datos manualmente.

Por lo tanto, cada vez que se actualiza la tabla, sus contenidos se vuelven a escribir en DATASET.

¿Hay alguna manera de distinguir si la célula fue modificada por el usuario o por updateTable?

pensé en desconectar on_tableWidget_cellChanged por updateTable temporalmente, pero parece estar un poco sucio.


Recomendaría cambiar de un QTableWidget a un QTableView con un modelo apropiado. Por lo que se dice, tiene una base de datos u otro objeto de datos que contiene y organiza los datos de todos modos, por lo que sería bastante fácil de hacer. Esto le permitiría distinguir entre ediciones (se setData en su modelo) y actualizaciones (se llama a los data en su modelo).


En una situación similar que acabo de usar

bool QObject::blockSignals ( bool block ) bool QObject::signalsBlocked () const

Bloquea las señales antes de configurar la mesa, luego desbloquea:

myTable.blockSignals(True) #blah-blah.. myTable.blockSignals(False)