Bueno, pues ya he probado y esta es mi solución.
Parto de la base de que tengo dos tablas, que comparten el filtro de eventos y algunos delegados. Además estas tablas tienen que poder tener alguna columna
bloqueada a voluntad del usuario. Si las columnas están bloqueadas, al pulsar tabulador o cursores debo saltarme esa columna.
Esta ha sido mi solución (si alguien está interesado pongo el código completo)
Código C++:
Ver originalclass TablaBase : public QTableView
{
Q_OBJECT
public:
TablaBase(int nColumnas, QWidget *parent=nullptr);
bool columnaBloqueada(int columna);
virtual void MostrarMenu(QPoint pos)=0;
~TablaBase();
int limiteIzquierdo;
int limiteDerecho;
private slots:
void Bloquear(int columna);
public slots:
void customMenuRequested(QPoint pos);
protected:
QHeaderView* cabecera;
QHeaderView* alturaFilas;
DelegadoEditorMediciones* dlgEM;
DelegadoColumnasBloqueadas* dlgCB;
bool* celdaBloqueada;
Filter* filtro;
};
class TablaPrincipal : public TablaBase
{
public:
explicit TablaPrincipal(int nColumnas, QWidget *parent=nullptr);
void MostrarMenu(QPoint pos);
};
class TablaMedicion : public TablaBase
{
public:
explicit TablaMedicion(int nColumnas, QWidget *parent=nullptr);
void MostrarMenu(QPoint pos);
};
y luego las implementaciones:
Código C++:
Ver originalTablaBase::TablaBase(int nColumnas, QWidget *parent): QTableView(parent)
{
celdaBloqueada = new bool[nColumnas];
for (int i=0;i<nColumnas;i++)
{
celdaBloqueada[i]=false;
}
cabecera = this->horizontalHeader();
dlgCB = new DelegadoColumnasBloqueadas;
dlgEM = new DelegadoEditorMediciones;
filtro = new Filter;
installEventFilter(filtro);
cabecera->setContextMenuPolicy(Qt::CustomContextMenu);
QObject::connect(cabecera, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customMenuRequested(QPoint)));
}
TablaBase::~TablaBase()
{
}
bool TablaBase::columnaBloqueada(int columna)
{
return celdaBloqueada[columna];
}
void TablaBase::Bloquear(int columna)
{
if (columna>=limiteIzquierdo && columna<=limiteDerecho)
{
celdaBloqueada[columna]=!celdaBloqueada[columna];
if (columnaBloqueada(columna))
{
setItemDelegateForColumn(columna,dlgCB);
}
else
{
setItemDelegateForColumn(columna,dlgEM);
}
clearSelection();
}
}
void TablaBase::customMenuRequested(QPoint pos)
{
MostrarMenu(pos);
}
TablaPrincipal::TablaPrincipal(int nColumnas, QWidget *parent): TablaBase(nColumnas, parent)
{
limiteIzquierdo=tipoColumna::NATURALEZA;
limiteDerecho=tipoColumna::PRCERT;
celdaBloqueada[tipoColumna::CODIGO]=true;
celdaBloqueada[tipoColumna::PORCERTPRES]=true;
celdaBloqueada[tipoColumna::IMPPRES]=true;
celdaBloqueada[tipoColumna::IMPCERT]=true;
setItemDelegateForColumn(tipoColumna::CODIGO,dlgCB);
setItemDelegateForColumn(tipoColumna::PORCERTPRES,dlgCB);
setItemDelegateForColumn(tipoColumna::IMPPRES,dlgCB);
setItemDelegateForColumn(tipoColumna::IMPCERT,dlgCB);
}
void TablaPrincipal::MostrarMenu(QPoint pos)
{
int column=this->horizontalHeader()->logicalIndexAt(pos);
qDebug()<<"Columna: "<<column;
QMenu *menu=new QMenu(this);
menu->addAction(new QAction("Bloquear columna", this));
menu->popup(this->horizontalHeader()->viewport()->mapToGlobal(pos));
//QObject::connect(menu->actions().at(0),SIGNAL(triggered(bool)),this,SLOT(Bloquear(int)));
}
TablaMedicion::TablaMedicion(int nColumnas, QWidget *parent): TablaBase(nColumnas, parent)
{
limiteIzquierdo=tipoColumna::COMENTARIO;
limiteDerecho=tipoColumna::FORMULA;
celdaBloqueada[tipoColumna::FASE]=true;
celdaBloqueada[tipoColumna::PARCIAL]=true;
celdaBloqueada[tipoColumna::SUBTOTAL]=true;
celdaBloqueada[tipoColumna::ID]=true;
setItemDelegateForColumn(tipoColumna::FASE,dlgCB);
setItemDelegateForColumn(tipoColumna::PARCIAL,dlgCB);
setItemDelegateForColumn(tipoColumna::SUBTOTAL,dlgCB);
setItemDelegateForColumn(tipoColumna::ID,dlgCB);
QObject::connect(cabecera, SIGNAL(sectionClicked(int)), this,SLOT(Bloquear(int)));
}
void TablaMedicion::MostrarMenu(QPoint pos)
{
int column=this->horizontalHeader()->logicalIndexAt(pos);
qDebug()<<"Columna: "<<column;
QMenu *menu=new QMenu(this);
menu->addAction(new QAction("Hacer algo", this));
menu->popup(this->horizontalHeader()->viewport()->mapToGlobal(pos));
}