Bueno, pues parece que definitivamente he resuelto el problema.
La cosa está en crear el filtro de eventos para el delegado en cuestión. En mi caso, el delegado es simplemente un QLineEdit. Este filtro de eventos captura la tecla Tab y lo que hace es mandar las señales de cerrar el editor y enviar los datos.
Respecto al envío de la señal de cerrar el editor, es importante que no ponga en modo Edit el siguiente delegado:
(QStyledItemDelegate::NoHint)
Además es importante que en caso de que se pulse la tecla deseada, retorne
false. Esto permite a la tabla hacer uso de dicho evento (la pulsación de la tecla Tab en este caso será leída también por la tabla...o el widget que sea).
Aquí está la implementación de la función en la clase de mi delegado (que es una clase heredada de QStyledItemDelegate):
Código C++:
Ver originalbool DelegadoNombre::eventFilter(QObject *obj, QEvent* event)
{
if (event->type()==QEvent::KeyPress)
{
QKeyEvent* key = static_cast<QKeyEvent*>(event);
if (key->key()==Qt::Key_Tab || key->key()==Qt::Key_Enter || key->key()==Qt::Key_Return)
{
QLineEdit *editor=qobject_cast<QLineEdit*>(obj);
emit commitData(editor);
emit closeEditor(editor, QStyledItemDelegate::NoHint);
}
else
{
return QObject::eventFilter(obj, event);
}
return false;
}
else
{
return QObject::eventFilter(obj, event);
}
return false;
}
Resumiendo, lo que estoy haciendo al pulsar Tab es cerrar el editor por medio de la señal
closeEditor() especificando que no abra el siguiente, y pasar dicha pulsación dela tecla Tab a la tabla para que la gestione si es el caso.