Ver Mensaje Individual
  #5 (permalink)  
Antiguo 30/11/2016, 03:55
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
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