2017-02-14 4 views
1

J'ai essayé de trouver la réponse à celle-ci avec google mais rien n'a de fruit. Je suis en train de convertir une application de Qt4 en Qt5. Cette application compilée parfaitement dans Qt4 mais quand j'essaye de compiler contre Qt5 maintenant cela me donne cette erreur de permission. Comme le statut de cette classe est protégé dans les deux versions, j'ai du mal à comprendre ce que je dois changer.'virtual bool QAbstractScrollArea :: eventFilter (QObject *, QEvent *)' est protégé

Ce problème de compilation a été répliqué sur quelques installations Ubuntu différentes (y compris wsl) mais je n'ai pas encore essayé dans Fedora.

est ici un sous-ensemble de la classe

#include <QWidget> 
#include <QEvent> 
#include <QTableWidget> 
#include <QItemDelegate> 
#include <QModelIndex> 
#include <QSize> 
#include <qdialog.h> 
#include <qcombobox.h> 
#include "ui_pegs_page.h" 
#include <string> 

class EGS_ConfigReader; 
class QProcess; 
class PEGS_RunOutput; 
class QTableWidget; 

struct Element { 
    int Z; 
    std::string symbol; 
float aw; 
float Iev; 
float rho; 
}; 

const int n_element = 100; 

extern Element element_data[]; 

class TableEventHandler : public QObject { 
    Q_OBJECT 
public: 
    TableEventHandler(QTableWidget *parent); 
protected: 
    bool eventFilter(QObject *o, QEvent *e); 
private: 
    QStringList itemCopy; 
    QList<QTableWidgetSelectionRange> copyRange; 
}; 

Edit:

est ici la méthode qui a des problèmes.

TableEventHandler::TableEventHandler(QTableWidget *parent) : 
    QObject(parent) { 
    if(parent == 0) 
    qFatal("TableEventHandler::TableEventHandler: parent can not be null!"); 
} 


bool TableEventHandler::eventFilter(QObject *o, QEvent *e) { 
    if(!o) qWarning("TableEventHandler::eventFilter called with 0 object?"); 
    if(QString(o->metaObject()->className()) != tr("QTableWidget")) { 
#ifdef EI_DEBUG 
     qDebug("Only QTableWidget objects accepted! Returning!"); 
#endif 
     return false; 
    } 
    QTableWidget *to = (QTableWidget *)o; 
    if(e->type() == QEvent::KeyPress) { 
    QKeyEvent *ke = (QKeyEvent*)e; 
    if(ke->matches(QKeySequence::Copy)){ 
     QString cellText; itemCopy.clear(); copyRange.clear(); 
     QList<QTableWidgetSelectionRange> ts = to->selectedRanges(); 
     if(!ts.isEmpty()) { 
      for (int irow = ts.first().topRow(); irow <= ts.first().bottomRow(); irow++){ 
       for (int icol = ts.first().leftColumn(); icol <= ts.first().rightColumn(); icol++){ 
        QTableWidgetItem *w = to->item(irow,icol); 
        if(w) cellText = w->text(); 
        if (!cellText.isEmpty()){ 
         itemCopy << cellText; 
        } 
        else 
         itemCopy << " "; 
       } 
      } 
      copyRange = ts; 
      //cout << itemCopy.join(", ").toLatin1().data() << endl; 
     } 
     else { 
      QTableWidgetItem *w = to->item(to->currentRow(), to->currentColumn()); 
      if (w) cellText = w->text(); 
      if (!cellText.isEmpty()) 
       itemCopy << cellText; 
      else itemCopy << ""; 
     } 
     return true; 
    } 
    else if(ke->matches(QKeySequence::Paste) && !itemCopy.isEmpty() && !copyRange.isEmpty()){ 
     QList<QTableWidgetSelectionRange> cs = to->selectedRanges(); 
     int top = cs.first().topRow(), left = cs.first().leftColumn(), icount = 0; 
     QTableWidgetSelectionRange ts = QTableWidgetSelectionRange(
             top , left, 
             top + copyRange.first().rowCount()-1, 
             left + copyRange.first().columnCount()-1); 
     for (int irow = ts.topRow(); irow <= ts.bottomRow(); irow++){ 
     for (int icol = ts.leftColumn(); icol <= ts.rightColumn(); icol++){ 
      if (++icount <= itemCopy.size()) 
       to->setItem(irow, icol, new QTableWidgetItem(itemCopy[icount-1])); 
       to->setItem(irow, icol, new QTableWidgetItem(itemCopy[icount-1])); 
     } 
     } 
     return true; 
    } 
    else if(ke->matches(QKeySequence::Cut)){ 
     QString cellText; itemCopy.clear(); copyRange.clear(); 
     QList<QTableWidgetSelectionRange> ts = to->selectedRanges(); 
     if(!ts.isEmpty()) { 
     for (int irow = ts.first().topRow(); irow <= ts.first().bottomRow(); irow++) { 
      for(int icol = ts.first().leftColumn(); icol <= ts.first().rightColumn(); icol++) { 
       QTableWidgetItem *w = to->item(irow,icol); 
       if(w) cellText = w->text(); 
       if (!cellText.isEmpty()){ 
        itemCopy << cellText; 
       } 
       else 
        itemCopy << ""; 
       to->setItem(irow,icol,0); 
      } 
     } 
     copyRange = ts; 
     //cout << itemCopy.join(", ").toLatin1().data() << endl; 
     } 
     return true; 
    } 
    else if(ke->matches(QKeySequence::Delete)){ 
     QList<QTableWidgetSelectionRange> ts = to->selectedRanges(); 
     if(!ts.isEmpty()) { 
     for (int irow = ts.first().topRow(); irow <= ts.first().bottomRow(); irow++) { 
      for(int icol = ts.first().leftColumn(); icol <= ts.first().rightColumn(); icol++) { 
       to->setItem(irow,icol,0); 
      } 
     } 
     } 
     return true; 
    } 
    else 
     to->eventFilter(o, e); 

    } 
    return false; 
} 

Répondre

0

Vous avez accès à la méthode QAbstractScrollArea::eventFilter(QObject*, QEvent*) protégée soit

  1. à partir d'une méthode d'une classe qui ne hérite pas de QAbstractScrollArea (très probablement), ou
  2. d'une méthode de certains autre classe qui n'est pas un ami de QAbstractScrollArea (peu probable), ou
  3. à partir d'une certaine fonction qui n'est pas un ami de QAbstractScrollArea (peu probable).

Notez que TableEventHandler hérite directement de QObject et non de QAbstractScrollArea. Donc, au cas où vous essayez d'appeler QAbstractScrollArea::eventFilter(QObject*, QEvent*) de l'une des méthodes de TableEventHandler, alors vous obtenez cette erreur.

EDIT: En regardant votre réponse sous la direction, je vois que vous appelez

to->eventFilter(o, e); 

dans TableEventHandler::eventFilter(QObject *o, QEvent *e)QTableWidget *to = (QTableWidget *)o;. Le programmeur a probablement signifié pour TableEventHandler::eventFilter de ne pas filtrer l'événement respectif à ce point. La méthode devrait alors simplement retourner false pour passer le contrôle à tout autre filtre d'événement installé plus tard sur cet objet.

+0

Je vois où vous allez avec cela et je vais explorer. Je me demande comment, s'il s'agit d'un problème d'héritage, cela n'est pas apparu dans qt4? – crcrewso