2017-02-14 33 views
1

我试图找到这个谷歌的答案,但没有任何结果。我正在将应用程序从Qt4转换为Qt5。这个应用程序在Qt4中完美编译,但是当我尝试对Qt5进行编译时,它给了我这个权限错误。由于这个类的状态在两个版本中都受到保护,所以我很难理解需要更改的内容。'虚拟布尔QAbstractScrollArea :: eventFilter(QObject *,QEvent *)'被保护

这个编译问题已被复制到几个不同的Ubuntu安装(包括wsl),但我还没有尝试在Fedora中。

这里的类的子集

#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; 
}; 

编辑:

下面是有问题的方法。

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; 
} 

回答

0

你从一些方法访问从一个类的方法保护QAbstractScrollArea::eventFilter(QObject*, QEvent*)方法要么

  1. 不从QAbstractScrollArea继承(最有可能),或
  2. 其他类别不是QAbstractScrollArea(不太可能)的朋友,或者
  3. 来自不是QAbstractScrollArea(不太可能)的朋友的某个功能。

请注意,TableEventHandler直接继承QObject而不是从QAbstractScrollArea继承。因此,如果您试图从TableEventHandler的某个方法调用QAbstractScrollArea::eventFilter(QObject*, QEvent*),那么您会得到该错误。

编辑:看你的编辑答案,我看到你在哪里TableEventHandler::eventFilter(QObject *o, QEvent *e)调用QTableWidget *to = (QTableWidget *)o;

to->eventFilter(o, e); 

。程序员可能意味着TableEventHandler::eventFilter不会过滤相应的事件。然后该方法应该返回false将控制权传递给稍后安装在该对象上的任何其他事件过滤器。

+0

我看到你要去那里,并将探索。我想知道,如果这是继承问题,这是不是在QT4? – crcrewso