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 originalbool Filter::eventFilter(QObject *object, QEvent *event)
{
QTableView* table = dynamic_cast<QTableView*>(object);
if( !table ) return false;
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Tab)
{
QModelIndex current = table->currentIndex();
if( current.column() != table->model()->columnCount() )
{
QModelIndex newIndex = table->model()->index(current.row(),current.column()+1);
qDebug()<<newIndex.row()<<"<--->"<<newIndex.column();//para saber la posicion
table->selectionModel()->select(newIndex,QItemSelectionModel::ClearAndSelect);
table->setCurrentIndex(newIndex);//para posicionarme en la nueva celda
return true;
}
}
}
return false;
}
El ejemplo completo (es sólo una tabla y un modelo que lee de un array)
filter.h
Código C++:
Ver original#ifndef FILTER_H
#define FILTER_H
#include <QObject>
#include <QTableView>
#include <QEvent>
#include <QKeyEvent>
#include <QDebug>
class Filter : public QObject
{
Q_OBJECT
public:
explicit Filter(QObject *parent = 0);
bool eventFilter(QObject *object, QEvent *event) override;
signals:
public slots:
};
#endif // FILTER_H
filter.cpp
Código C++:
Ver original#include "filter.h"
Filter::Filter(QObject *parent) : QObject(parent)
{
}
bool Filter::eventFilter(QObject *object, QEvent *event)
{
QTableView* table = dynamic_cast<QTableView*>(object);
if( !table ) return false;
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Tab)
{
QModelIndex current = table->currentIndex();
if( current.column() != table->model()->columnCount() )
{
QModelIndex newIndex = table->model()->index(current.row(),current.column()+1);
qDebug()<<newIndex.row()<<"<--->"<<newIndex.column();
table->selectionModel()->select(newIndex,QItemSelectionModel::ClearAndSelect);
table->setCurrentIndex(newIndex);
return true;
}
}
}
return false;
}
el modelo:
Código C++:
Ver original#ifndef MIMODELO_H
#define MIMODELO_H
#include <QObject>
#include <QAbstractTableModel>
const int FILAS = 5;
const int COLUMNAS = 5;
class MiModelo : public QAbstractTableModel
{
public:
MiModelo();
int rowCount(const QModelIndex& parent) const;
int columnCount(const QModelIndex& parent) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
QVariant data(const QModelIndex& indice,int role = Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
bool setData(const QModelIndex & index, const QVariant& value, int role);
private:
int valores[FILAS][COLUMNAS];
};
#endif // MIMODELO_H
Código C++:
Ver original#include "mimodelo.h"
MiModelo::MiModelo()
{
for (int i=0;i<FILAS;i++)
{
for (int j=0;j<COLUMNAS;j++)
{
valores[i][j]=0;
}
}
}
int MiModelo::rowCount(const QModelIndex& parent) const
{
return FILAS;
}
int MiModelo::columnCount(const QModelIndex& parent) const
{
return COLUMNAS;
}
QVariant MiModelo::headerData(int section, Qt::Orientation orientation, int role) const
{
return QVariant();
}
QVariant MiModelo::data(const QModelIndex& indice,int role) const
{
if (!indice.isValid()) return QVariant();
if (role==Qt::DisplayRole || role == Qt::EditRole)
{
return valores[indice.row()][indice.column()];
}
return QVariant();
}
Qt::ItemFlags MiModelo::flags(const QModelIndex &index) const
{
if (!index.isValid())
{
return 0;
}
else return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
}
bool MiModelo::setData(const QModelIndex & index, const QVariant& value, int role)
{
if (index.isValid() && (role == Qt::EditRole || role == Qt::DisplayRole))
{
valores[index.row()][index.column()]= value.toInt();
emit dataChanged(index, index);
return true;
}
return false;
}
y por último el widget:
Código C++:
Ver original#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "mimodelo.h"
#include "filter.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
MiModelo* _model;
Filter* filter;
};
#endif // WIDGET_H
Código C++:
Ver original#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
_model = new MiModelo;
ui->tableView->setModel(_model);
filter = new Filter;
ui->tableView->installEventFilter(filter);
}
Widget::~Widget()
{
delete ui;
}
Saludos y gracias!