Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/01/2017, 05:34
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: ¿Se puede crear una interfaz heredando de otra clase?

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 original
  1. class TablaBase : public QTableView
  2. {
  3.     Q_OBJECT
  4.  
  5. public:
  6.     TablaBase(int nColumnas, QWidget *parent=nullptr);
  7.     bool columnaBloqueada(int columna);
  8.     virtual void MostrarMenu(QPoint pos)=0;
  9.     ~TablaBase();
  10.  
  11.     int limiteIzquierdo;
  12.     int limiteDerecho;
  13.  
  14. private slots:
  15.     void Bloquear(int columna);
  16.  
  17. public slots:
  18.     void customMenuRequested(QPoint pos);
  19.  
  20. protected:
  21.     QHeaderView* cabecera;
  22.     QHeaderView* alturaFilas;
  23.     DelegadoEditorMediciones* dlgEM;
  24.     DelegadoColumnasBloqueadas* dlgCB;    
  25.     bool* celdaBloqueada;
  26.     Filter* filtro;
  27. };
  28.  
  29. class TablaPrincipal : public TablaBase
  30. {
  31. public:
  32.     explicit TablaPrincipal(int nColumnas, QWidget *parent=nullptr);
  33.     void MostrarMenu(QPoint pos);
  34.  
  35. };
  36.  
  37. class TablaMedicion : public TablaBase
  38. {
  39. public:
  40.     explicit TablaMedicion(int nColumnas, QWidget *parent=nullptr);
  41.     void MostrarMenu(QPoint pos);
  42.  
  43. };

y luego las implementaciones:
Código C++:
Ver original
  1. TablaBase::TablaBase(int nColumnas, QWidget *parent): QTableView(parent)
  2. {
  3.     celdaBloqueada =  new bool[nColumnas];
  4.     for (int i=0;i<nColumnas;i++)
  5.     {
  6.         celdaBloqueada[i]=false;
  7.     }
  8.     cabecera = this->horizontalHeader();    
  9.     dlgCB = new DelegadoColumnasBloqueadas;
  10.     dlgEM = new DelegadoEditorMediciones;
  11.     filtro = new Filter;
  12.     installEventFilter(filtro);
  13.     cabecera->setContextMenuPolicy(Qt::CustomContextMenu);
  14.     QObject::connect(cabecera, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customMenuRequested(QPoint)));
  15. }
  16.  
  17. TablaBase::~TablaBase()
  18. {
  19.  
  20. }
  21.  
  22. bool TablaBase::columnaBloqueada(int columna)
  23. {
  24.     return celdaBloqueada[columna];
  25. }
  26.  
  27. void TablaBase::Bloquear(int columna)
  28. {
  29.     if (columna>=limiteIzquierdo && columna<=limiteDerecho)
  30.     {
  31.         celdaBloqueada[columna]=!celdaBloqueada[columna];
  32.         if (columnaBloqueada(columna))
  33.         {
  34.             setItemDelegateForColumn(columna,dlgCB);
  35.         }
  36.         else
  37.         {
  38.             setItemDelegateForColumn(columna,dlgEM);
  39.         }
  40.         clearSelection();
  41.     }
  42. }
  43.  
  44. void TablaBase::customMenuRequested(QPoint pos)
  45. {
  46.     MostrarMenu(pos);
  47. }
  48.  
  49. TablaPrincipal::TablaPrincipal(int nColumnas, QWidget *parent): TablaBase(nColumnas, parent)
  50. {
  51.     limiteIzquierdo=tipoColumna::NATURALEZA;
  52.     limiteDerecho=tipoColumna::PRCERT;
  53.  
  54.     celdaBloqueada[tipoColumna::CODIGO]=true;
  55.     celdaBloqueada[tipoColumna::PORCERTPRES]=true;
  56.     celdaBloqueada[tipoColumna::IMPPRES]=true;
  57.     celdaBloqueada[tipoColumna::IMPCERT]=true;
  58.     setItemDelegateForColumn(tipoColumna::CODIGO,dlgCB);
  59.     setItemDelegateForColumn(tipoColumna::PORCERTPRES,dlgCB);
  60.     setItemDelegateForColumn(tipoColumna::IMPPRES,dlgCB);
  61.     setItemDelegateForColumn(tipoColumna::IMPCERT,dlgCB);
  62. }
  63.  
  64. void TablaPrincipal::MostrarMenu(QPoint pos)
  65. {
  66.     int column=this->horizontalHeader()->logicalIndexAt(pos);
  67.     qDebug()<<"Columna: "<<column;
  68.  
  69.     QMenu *menu=new QMenu(this);
  70.     menu->addAction(new QAction("Bloquear columna", this));
  71.     menu->popup(this->horizontalHeader()->viewport()->mapToGlobal(pos));
  72.     //QObject::connect(menu->actions().at(0),SIGNAL(triggered(bool)),this,SLOT(Bloquear(int)));
  73. }
  74.  
  75. TablaMedicion::TablaMedicion(int nColumnas, QWidget *parent): TablaBase(nColumnas, parent)
  76. {
  77.     limiteIzquierdo=tipoColumna::COMENTARIO;
  78.     limiteDerecho=tipoColumna::FORMULA;
  79.  
  80.     celdaBloqueada[tipoColumna::FASE]=true;
  81.     celdaBloqueada[tipoColumna::PARCIAL]=true;
  82.     celdaBloqueada[tipoColumna::SUBTOTAL]=true;
  83.     celdaBloqueada[tipoColumna::ID]=true;
  84.     setItemDelegateForColumn(tipoColumna::FASE,dlgCB);
  85.     setItemDelegateForColumn(tipoColumna::PARCIAL,dlgCB);
  86.     setItemDelegateForColumn(tipoColumna::SUBTOTAL,dlgCB);
  87.     setItemDelegateForColumn(tipoColumna::ID,dlgCB);
  88.  
  89.     QObject::connect(cabecera, SIGNAL(sectionClicked(int)), this,SLOT(Bloquear(int)));
  90.  
  91. }
  92.  
  93. void TablaMedicion::MostrarMenu(QPoint pos)
  94. {
  95.     int column=this->horizontalHeader()->logicalIndexAt(pos);
  96.     qDebug()<<"Columna: "<<column;
  97.  
  98.     QMenu *menu=new QMenu(this);
  99.     menu->addAction(new QAction("Hacer algo", this));
  100.     menu->popup(this->horizontalHeader()->viewport()->mapToGlobal(pos));
  101. }
__________________
Mi calculadora en Qt