Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Qt. Cómo evitar el modo de edición al avanzar con Tab

Estas en el tema de Qt. Cómo evitar el modo de edición al avanzar con Tab en el foro de C/C++ en Foros del Web. Bueno, la pregunta es la siguiente: Si tengo una QTableView y edito una celda, y luego me sigo moviendo con la techa Tab, entro en ...
  #1 (permalink)  
Antiguo 27/11/2016, 10:26
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Qt. Cómo evitar el modo de edición al avanzar con Tab

Bueno, la pregunta es la siguiente:

Si tengo una QTableView y edito una celda, y luego me sigo moviendo con la techa Tab, entro en modo de edición en la siguiente celda, y me gustaría que saliese del modo de edición al cambiar de celda. Más o menos como ocurre con una hoja de cálculo.

Saludos y gracias!
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 27/11/2016, 15:46
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

QTableView debería tener un método llamado setTabKeyNavitagion que acepta un booleano:
  • true para que tab permita pasar de una celda a la siguiente
  • false para que tab entre en modo edición
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 28/11/2016, 03:26
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Hola eferion:

He probado así, pero creo que no es lo que realmente busco.
Si está en true (por defecto), cuando he editado una celda pasa a la celda de la derecha en modo edición. Si está en false, para al siguiente widget de mi programa (un editor de textos en este caso)

Pero a mi me gustaría que pasara a la celda contigua sin modo de edición. No sé si será cuestión de definir su comportamiento por medio de QKeyEvent. A ver si a lo largo del día puedo hacer una prueba.
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 28/11/2016, 05:42
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Efectivamente. Para esa funcionalidad tienes que interceptar la pulsación del tabulador.

Esto lo puedes hacer heredando la tabla o mediante un filtro de eventos. Yo personalmente te recomendaría esta segunda opción:

Código C++:
Ver original
  1. class Filter : public QObject
  2. {
  3.   Q_OBJECT;
  4.  
  5.   public:
  6.  
  7.     bool eventFilter(QObject *object, QEvent *event) override;
  8.  
  9. };
  10.  
  11. bool Filter::eventFilter(QObject *object, QEvent *event)
  12. {
  13.   QTableView* table = dynamic_cast<QTableView*>(object);
  14.   if( !table ) return false;
  15.  
  16.   if (event->type() == QEvent::KeyPress)
  17.   {
  18.     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
  19.     if (keyEvent->key() == Qt::Key_Tab)
  20.     {
  21.       QModelIndex current = table->currentIndex();
  22.       if( current.column() != table->model()->columnCount() )
  23.       {
  24.         QModelIndex newIndex = table->model()->index(current.row(),current.column()+1);
  25.         table->selectionModel()->select(newIndex,QItemSelectionModel::ClearAndSelect);
  26.         return true;
  27.       }
  28.     }
  29.   }
  30.   return false;
  31. }

Y para usarlo:

Código C++:
Ver original
  1. Filter* filter = new Filter;
  2. QTableView* table /* ... */;
  3. table->installEventFilter(filter);
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 30/11/2016, 03:55
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Hola eferion:
Gracias por responder. He tardado un poco en responder yo, porque hasta ayer no me pude poner a ver el ejemplo. La cosa es que no funcionaba, y por si acaso, he repetido el ejemplo con una tabla sencilla, recien creada, no con la que estoy trabajando...y tampoco.

Cuando estoy en modo de edición, el evento no se captura, y salto de celda en celda en modo edición siempre.
Si estoy fuera del modo de edición, entonces sí que se captura el tabulador. (en este caso me aparece la info que me da qDebug de la posición de cada fila y columna.Además, he de posicionarme en la celda actual y le he añadido una línea a tu código).

Código C++:
Ver original
  1. bool Filter::eventFilter(QObject *object, QEvent *event)
  2. {
  3.     QTableView* table = dynamic_cast<QTableView*>(object);
  4.     if( !table ) return false;
  5.  
  6.     if (event->type() == QEvent::KeyPress)
  7.     {
  8.         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
  9.         if (keyEvent->key() == Qt::Key_Tab)
  10.         {
  11.             QModelIndex current = table->currentIndex();
  12.             if( current.column() != table->model()->columnCount() )
  13.             {
  14.                 QModelIndex newIndex = table->model()->index(current.row(),current.column()+1);
  15.                 qDebug()<<newIndex.row()<<"<--->"<<newIndex.column();//para saber la posicion
  16.                 table->selectionModel()->select(newIndex,QItemSelectionModel::ClearAndSelect);
  17.                 table->setCurrentIndex(newIndex);//para posicionarme en la nueva celda
  18.                 return true;
  19.             }
  20.         }
  21.     }
  22.     return false;
  23. }

El ejemplo completo (es sólo una tabla y un modelo que lee de un array)
filter.h
Código C++:
Ver original
  1. #ifndef FILTER_H
  2. #define FILTER_H
  3.  
  4. #include <QObject>
  5. #include <QTableView>
  6. #include <QEvent>
  7. #include <QKeyEvent>
  8. #include <QDebug>
  9.  
  10. class Filter : public QObject
  11. {
  12.     Q_OBJECT
  13. public:
  14.     explicit Filter(QObject *parent = 0);
  15.     bool eventFilter(QObject *object, QEvent *event) override;
  16.  
  17. signals:
  18.  
  19. public slots:
  20. };
  21.  
  22. #endif // FILTER_H

filter.cpp
Código C++:
Ver original
  1. #include "filter.h"
  2.  
  3. Filter::Filter(QObject *parent) : QObject(parent)
  4. {
  5.  
  6. }
  7.  
  8. bool Filter::eventFilter(QObject *object, QEvent *event)
  9. {
  10.     QTableView* table = dynamic_cast<QTableView*>(object);
  11.     if( !table ) return false;
  12.  
  13.     if (event->type() == QEvent::KeyPress)
  14.     {
  15.         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
  16.         if (keyEvent->key() == Qt::Key_Tab)
  17.         {
  18.             QModelIndex current = table->currentIndex();
  19.             if( current.column() != table->model()->columnCount() )
  20.             {
  21.                 QModelIndex newIndex = table->model()->index(current.row(),current.column()+1);
  22.                 qDebug()<<newIndex.row()<<"<--->"<<newIndex.column();
  23.                 table->selectionModel()->select(newIndex,QItemSelectionModel::ClearAndSelect);
  24.                 table->setCurrentIndex(newIndex);
  25.                 return true;
  26.             }
  27.         }
  28.     }
  29.     return false;
  30. }

el modelo:
Código C++:
Ver original
  1. #ifndef MIMODELO_H
  2. #define MIMODELO_H
  3.  
  4. #include <QObject>
  5. #include <QAbstractTableModel>
  6.  
  7. const int FILAS = 5;
  8. const int COLUMNAS = 5;
  9.  
  10. class MiModelo : public QAbstractTableModel
  11. {
  12. public:
  13.  
  14.     MiModelo();
  15.  
  16.     int rowCount(const QModelIndex& parent) const;
  17.     int columnCount(const QModelIndex& parent) const;
  18.     QVariant headerData(int section, Qt::Orientation orientation, int role) const;
  19.     QVariant data(const QModelIndex& indice,int role = Qt::DisplayRole) const;
  20.     Qt::ItemFlags flags(const QModelIndex &index) const;
  21.     bool setData(const QModelIndex & index, const QVariant& value, int role);
  22.  
  23. private:
  24.     int valores[FILAS][COLUMNAS];
  25. };
  26.  
  27. #endif // MIMODELO_H

Código C++:
Ver original
  1. #include "mimodelo.h"
  2.  
  3. MiModelo::MiModelo()
  4. {
  5.     for (int i=0;i<FILAS;i++)
  6.     {
  7.         for (int j=0;j<COLUMNAS;j++)
  8.         {
  9.             valores[i][j]=0;
  10.         }
  11.     }
  12.  
  13. }
  14.  
  15. int MiModelo::rowCount(const QModelIndex& parent) const
  16. {
  17.     return FILAS;
  18. }
  19.  
  20. int MiModelo::columnCount(const QModelIndex& parent) const
  21. {
  22.     return COLUMNAS;
  23. }
  24.  
  25. QVariant MiModelo::headerData(int section, Qt::Orientation orientation, int role) const
  26. {
  27.     return QVariant();
  28. }
  29.  
  30. QVariant MiModelo::data(const QModelIndex& indice,int role) const
  31. {
  32.     if (!indice.isValid()) return QVariant();
  33.  
  34.     if (role==Qt::DisplayRole || role == Qt::EditRole)
  35.     {
  36.         return valores[indice.row()][indice.column()];
  37.     }
  38.     return QVariant();
  39. }
  40.  
  41. Qt::ItemFlags MiModelo::flags(const QModelIndex &index) const
  42. {
  43.     if (!index.isValid())
  44.     {
  45.         return 0;
  46.     }
  47.     else return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
  48. }
  49.  
  50. bool MiModelo::setData(const QModelIndex & index, const QVariant& value, int role)
  51. {
  52.     if (index.isValid() && (role == Qt::EditRole || role == Qt::DisplayRole))
  53.     {
  54.         valores[index.row()][index.column()]= value.toInt();
  55.         emit dataChanged(index, index);
  56.         return true;
  57.     }
  58.     return false;
  59. }

y por último el widget:

Código C++:
Ver original
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QWidget>
  5.  
  6. #include "mimodelo.h"
  7. #include "filter.h"
  8.  
  9. namespace Ui {
  10. class Widget;
  11. }
  12.  
  13. class Widget : public QWidget
  14. {
  15.     Q_OBJECT
  16.  
  17. public:
  18.     explicit Widget(QWidget *parent = 0);
  19.     ~Widget();
  20.  
  21. private:
  22.     Ui::Widget *ui;
  23.     MiModelo* _model;
  24.     Filter* filter;
  25. };
  26.  
  27. #endif // WIDGET_H

Código C++:
Ver original
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3.  
  4. Widget::Widget(QWidget *parent) :
  5.     QWidget(parent),
  6.     ui(new Ui::Widget)
  7. {
  8.     ui->setupUi(this);
  9.     _model =  new MiModelo;
  10.     ui->tableView->setModel(_model);
  11.  
  12.     filter = new Filter;
  13.     ui->tableView->installEventFilter(filter);
  14. }
  15.  
  16. Widget::~Widget()
  17. {
  18.     delete ui;
  19. }

Saludos y gracias!
__________________
Mi calculadora en Qt
  #6 (permalink)  
Antiguo 30/11/2016, 04:18
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Si estás en modo edición no es la tabla la que recibe el evento sino el widget de edición.

Tendrías que editar la generación de los widgets de edición para insertar el filtro de eventos en dicho widget.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #7 (permalink)  
Antiguo 01/12/2016, 03:55
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Bueno, pues no lo consigo.

He creado un delegado para las celdas.
En la función createEditor() he añadido el filtro de eventos:

Código C++:
Ver original
  1. QWidget* MiDelegado::createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const
  2. {
  3.     const QAbstractItemModel* model = index.model();
  4.     if (!model)
  5.     {
  6.         return QStyledItemDelegate::createEditor(parent,option,index);
  7.     }
  8.     QLineEdit* miEditor = new QLineEdit(parent);
  9.     QRegExpValidator* validadorEdad = new QRegExpValidator(QRegExp("[0-9.,]{1,10}"),miEditor);
  10.     miEditor->setValidator(validadorEdad);
  11.     miEditor->setAlignment(Qt::AlignLeft);
  12.     miEditor->installEventFilter(filter);
  13.     return miEditor;
  14. }

Pero ahora, cuando estoy con el filtro de eventos, veo que responde a todas las pulsaciones de teclas menos a la del tabulador, y ahí me he quedado...

Código C++:
Ver original
  1. bool Filter::eventFilter(QObject *object, QEvent *event)
  2. {  
  3.     QLineEdit *editor = dynamic_cast<QLineEdit*>(object);
  4.     if (!editor)
  5.     {
  6.         return false;
  7.     }
  8.     if (event->type() == QEvent::KeyPress)
  9.     {
  10.         QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
  11.         qDebug()<<event->type();
  12.  
  13.         if (keyEvent->key() == Qt::Key_Tab)
  14.         {
  15.             qDebug()<<"Tab";
  16.             //QModelIndex current = editor->parent()->objectName();
  17.             //qDebug()<<editor->parent()->objectName();
  18.  
  19.             //qDebug()<<editor->parent()->objectName();
  20.  
  21.             return true;
  22.         }
  23.     }
  24.     return false;
  25. }

Es curioso porque es la única tecla que no considera
__________________
Mi calculadora en Qt
  #8 (permalink)  
Antiguo 01/12/2016, 04:07
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Por otro lado, creo que el evento FocusOut podría valer, ya que es independiente de la tecla pulsada, pero tengo otro problema, y es que no sé cómo acceder a la tabla desde el editor.
¿Puede ser que el editor no sea hijo de la tabla siempre, o es que yo lo he hecho mal y no he ligado el editor a la tabla?

Al usar el evento, me sale que el nombre del padre es "qt_scrollarea_viewport"

Código C++:
Ver original
  1. if (event->type() == QEvent::FocusOut)
  2.     {
  3.         qDebug()<<editor->parent()->objectName();
  4. ...............
__________________
Mi calculadora en Qt
  #9 (permalink)  
Antiguo 01/12/2016, 05:33
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

El problema que tienes es que no sabes cómo funciona la edición por debajo.

Al editar una celda lo que sucede es que se crea un widget que, por defecto, se va a superponer a la celda a editar, de tal forma que al usuario le da la impresión de que está escribiendo sobre la propia celda... pero no es así. Dicho widget de edición se carga dentro de un contenedor que es ese viewport que comentas.

En cuanto al tema del tabulador en edición, yo probaría a hacer algo tal que:

Código C++:
Ver original
  1. void MiDelegado::closeEditor(QWidget* editor, QAbstractItemDelegate::EndEditHint hint)
  2. {
  3.   if (hint == QAbstractItemDelegate::EditNextItem && currentColumn() == 1)
  4.     hint = QAbstractItemDelegate::EditPreviousItem;
  5.   else if (hint == QAbstractItemDelegate::EditPreviousItem && currentColumn() == 0)
  6.     hint = QAbstractItemDelegate::EditNextItem;
  7.   [ClaseBase]::closeEditor(editor, hint); // Sustuir [ClaseBase]
  8. }
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #10 (permalink)  
Antiguo 01/12/2016, 11:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Hola eferion, sabía como funcionaban los delegados....porque ya me lo habías explicado , lo que pasa es que cuando no me salen las cosas uno acaba sin saber dónde tiene la cara.

Bueno, lo he "solucionado" pero no estoy nada convencido de que esta sea una solución decente.
Al menos he podido delegar los eventos en los delegados (nunca mejor dicho) pero necesito conectar la señal closeEditor() a la tabla.

En realidad lo que he hecho es capturar la tecla Tab en el editor del delegado, cuyas consecuencias son actualizar el dato de la celda y cerrar el editor
Código C++:
Ver original
  1. commitData(mieditor);
  2. closeEditor(mieditor);

Por otro lado, he conectado la señal closeEditor a un slot que se encarga de mover el índice actual de la tabla. No parece un diseño muy aceptable

En fin, este sería el código de lo que he hecho finalmente (la implementación está incompleta pero todo parece pensar que va a funcionar)

en el delegado:

Código C++:
Ver original
  1. bool MiDelegado::eventFilter(QObject * editor, QEvent * event)
  2. {
  3.     if (!editor)
  4.     {
  5.         return false;
  6.     }
  7.     if (event->type() == QEvent::KeyPress)
  8.     {
  9.         QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
  10.         if (keyEvent->key() == Qt::Key_Tab)
  11.         {
  12.             QLineEdit* mieditor = dynamic_cast<QLineEdit*>(editor);
  13.             commitData(mieditor);
  14.             closeEditor(mieditor);
  15.             return true;
  16.         }
  17.     }
  18.     return false;
  19. }

La conexión SIGNAL/SLOT

Código C++:
Ver original
  1. QObject::connect(delegado,SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)),this,SLOT(Posicionar()));

Y el código del SLOT (incompleto)
Código C++:
Ver original
  1. void Widget::Posicionar()
  2. {
  3.     QModelIndex current = ui->tableView->currentIndex();
  4.     qDebug()<<current.row()<<"<-->"<<current.column();
  5.     if (current.column()<ui->tableView->model()->columnCount(QModelIndex()))
  6.     {
  7.         QModelIndex newIndex = ui->tableView->model()->index(current.row(),current.column()+1);
  8.         ui->tableView->setCurrentIndex(newIndex);
  9.     }
  10. }
__________________
Mi calculadora en Qt
  #11 (permalink)  
Antiguo 02/12/2016, 02:16
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Bueno, como sospechaba, esta solución está lejos de ser válida, ya que sólo me contempla el caso de pulsar la tecla Tab, y no podría (o al menos de forma sencilla) definir el comportamiento de BackTab o Return, por ejemplo.

Por otro lado el ejemplo que me has puesto, de redefinir la señal de closeEditor tampoco me funciona.
__________________
Mi calculadora en Qt
  #12 (permalink)  
Antiguo 02/12/2016, 03:14
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

¿Has probado lo que te he comentado en mi última respuesta?
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #13 (permalink)  
Antiguo 02/12/2016, 04:28
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Cita:
Iniciado por eferion Ver Mensaje
¿Has probado lo que te he comentado en mi última respuesta?
Si. Ya te comentaba que el definir la función closeEditor no me ha funcionado.
Aunque también es verdad que no he sabido de dónde sale la función currentColumn() y no se me ocurrió otra cosa que quitarlo de la condición:

Esto es lo que puse (que no me funcionó):
Código Python:
Ver original
  1. void MiDelegado::closeEditor(QWidget* editor, QAbstractItemDelegate::EndEditHint hint)
  2. {
  3.     qDebug()<<"Cerrando el editor";
  4.     if (hint == QAbstractItemDelegate::EditNextItem /*&& currentColumn() == 1*/)
  5.         hint = QAbstractItemDelegate::EditNextItem;
  6.       else if (hint == QAbstractItemDelegate::EditPreviousItem /*&& currentColumn() == 0*/)
  7.         hint = QAbstractItemDelegate::EditNextItem;
  8.       QAbstractItemDelegate::closeEditor(editor, hint);
  9. }

Por otro lado al leer en la ayuda:
"The hint provides a way for the delegate to influence how the model and view behave after editing is completed. It indicates to these components what action should be performed next to provide a comfortable editing experience for the user. For example, if EditNextItem is specified, the view should use a delegate to open an editor on the next item in the model."

pensé que no era este el camino correcto, ya que parece que precisamente el hint EditNextItem lo que hace es abrir el siguiente widget en modo de edición. Pero vamos, que estoy hecho un lío

edito: creo que no lo he traducido bien, entonces lo que dice es que "si se especifica EditNextItem, la vista debería usar un delegado para abrir un editor en el siguiente item del modelo"
(pero aún así, me he quedado igual)
__________________
Mi calculadora en Qt
  #14 (permalink)  
Antiguo 02/12/2016, 07:08
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Es decir, tu lo que quieres es que si estás en modo edición y presionas el tabulador que se salga del modo edición y salte a la siguiente celda... pero sin editarla. ¿cierto?
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #15 (permalink)  
Antiguo 02/12/2016, 07:40
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Cita:
Iniciado por eferion Ver Mensaje
Es decir, tu lo que quieres es que si estás en modo edición y presionas el tabulador que se salga del modo edición y salte a la siguiente celda... pero sin editarla. ¿cierto?
Eso es
__________________
Mi calculadora en Qt
  #16 (permalink)  
Antiguo 29/12/2016, 15:25
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

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 original
  1. bool DelegadoNombre::eventFilter(QObject *obj, QEvent* event)
  2. {
  3.     if (event->type()==QEvent::KeyPress)
  4.     {
  5.         QKeyEvent* key = static_cast<QKeyEvent*>(event);
  6.         if (key->key()==Qt::Key_Tab || key->key()==Qt::Key_Enter || key->key()==Qt::Key_Return)
  7.         {
  8.             QLineEdit *editor=qobject_cast<QLineEdit*>(obj);
  9.             emit commitData(editor);
  10.             emit closeEditor(editor, QStyledItemDelegate::NoHint);
  11.         }
  12.         else
  13.         {
  14.             return QObject::eventFilter(obj, event);
  15.         }
  16.         return false;
  17.     }
  18.     else
  19.     {
  20.         return QObject::eventFilter(obj, event);
  21.     }
  22.     return false;
  23. }

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.
__________________
Mi calculadora en Qt
  #17 (permalink)  
Antiguo 02/01/2017, 02:40
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Celebro que hayas encontrado la respuesta. He estado ausente con eso de que se acababa el año y no te he podido prestar más asistencia.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #18 (permalink)  
Antiguo 02/01/2017, 15:55
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Cita:
Iniciado por eferion Ver Mensaje
Celebro que hayas encontrado la respuesta. He estado ausente con eso de que se acababa el año y no te he podido prestar más asistencia.

Un saludo.
La clave me la diste tú. Realmente mi aportación ha sido poca en la solución

Mi mayor problema es poder dedicarle tiempo a esto. Ahora en vacaciones lo retomo, pero no suelo disponer de un día o una mañana entera para poder avanzar como quisiera
__________________
Mi calculadora en Qt

Etiquetas: edición, modo, tab
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:34.