es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo entro en el modo de edición en QTableView cuando presiono la tecla Enter o Return?

Por defecto, se pueden establecer desencadenadores para entrar en modo de regactivación de celdas mediante la función setEditTriggers. Sin embargo, no hay un desencadenador para el botón de entrada o retorno.

Intenté hacer esto sobrescribiendo la función keyPressEvent. Pero me da un error “edit: failed” en la terminal.

class UTableView(QTableView):
    def __init__(self, parent=None):
        super(UTableView, self).__init__(parent)
        self.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.EditKeyPressed)

    def keyPressEvent(self, event):
        if event.type() == QEvent.KeyPress and (event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter):
            self.edit(self.currentIndex())
        super(UTableView, self).keyPressEvent(event)

¿Cuál es la forma correcta de resolver mi problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución sería anular la función edit en lugar de la función keyPressEvent. Esto se puede hacer mediante la subclasificación de la clase QItemDelegate y definiendo un delegado personalizado para la vista de tabla. El delegado personalizado debería sobreescribir las funciones createEditor y setEditorData para crear y poblar un widget de edición para la celda, y la función setModelData para actualizar el modelo con los nuevos datos ingresados por el usuario. Finalmente, el delegado personalizado debería anular la función eventFilter para capturar los eventos de presión de tecla y manejar las teclas Enter y Return adecuadamente.

    Aquí hay un ejemplo de cómo se podría implementar:

        class UTableDelegate(QItemDelegate):
            def createEditor(self, parent, option, index):
                editor = QLineEdit(parent)
                return editor
            
            def setEditorData(self, editor, index):
                value = index.data(Qt.DisplayRole)
                editor.setText(str(value))
            
            def setModelData(self, editor, model, index):
                value = editor.text()
                model.setData(index, value, Qt.EditRole)
            
            def eventFilter(self, editor, event):
                if event.type() == QEvent.KeyPress and (event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter):
                    self.commitData.emit(editor) # commit data to the model
                    self.closeEditor.emit(editor, QAbstractItemDelegate.NoHint) # hide the editor
                    return True
                return super().eventFilter(editor, event)

        class UTableView(QTableView):
            def init(self, parent=None):
                super(UTableView, self).init(parent)
                delegate = UTableDelegate(self)
                self.setItemDelegate(delegate)
                self.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.EditKeyPressed)

    El código anterior define una subclase de delegado personalizado (UTableDelegate) que anula las funciones createEditor, setEditorData, setModelData y eventFilter. La clase UTableView luego crea una instancia de este delegado y lo establece como el delegado predeterminado para la vista de tabla mediante la función setItemDelegate.

    Ahora, cuando el usuario presiona la tecla Enter o Return mientras edita una celda, la función eventFilter en la clase UTableDelegate será llamada, lo que comprometerá los datos ingresados por el usuario en el modelo y ocultará el widget de edición.

Comments are closed.