【问题标题】:‘virtual bool QAbstractScrollArea::eventFilter(QObject*, QEvent*)’ is protected'virtual bool QAbstractScrollArea::eventFilter(QObject*, QEvent*)' 受保护
【发布时间】:2017-02-14 21:12:57
【问题描述】:

我试图通过谷歌找到这个问题的答案,但没有任何结果。我正在将应用程序从 Qt4 转换为 Qt5。该应用程序在 Qt4 中完美编译,但是当我现在尝试针对 Qt5 进行编译时,它给了我这个权限错误。由于这个类的状态在两个版本中都受到保护,我很难理解我需要改变什么。

这个编译问题已经在几个不同的 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;
}

【问题讨论】:

    标签: c++ qt4 qt5 qtwidgets


    【解决方案1】:

    您正在访问受保护的QAbstractScrollArea::eventFilter(QObject*, QEvent*) 方法

    1. 来自不继承自 QAbstractScrollArea 的类的方法(很可能),或
    2. 来自不是QAbstractScrollArea 朋友的其他类的方法(不太可能),或者
    3. 来自某个不是QAbstractScrollArea 朋友的函数(不太可能)。

    请注意,TableEventHandler 直接继承自 QObject 而不是 QAbstractScrollArea。因此,如果您尝试从 TableEventHandler 的方法之一调用 QAbstractScrollArea::eventFilter(QObject*, QEvent*),则会收到该错误。

    编辑:查看您编辑的答案,我知道您在打电话

    to->eventFilter(o, e);
    

    TableEventHandler::eventFilter(QObject *o, QEvent *e)QTableWidget *to = (QTableWidget *)o;。程序员可能意味着TableEventHandler::eventFilter 在那时不要过滤相应的事件。然后,该方法应该只返回 false 以将控制权传递给稍后安装在该对象上的任何其他事件过滤器。

    【讨论】:

    • 我知道你要去哪里,并将探索。我想知道,如果这是一个继承问题,这在 qt4 中没有出现吗?
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2016-02-19
    • 2014-03-05
    • 2015-09-05
    • 1970-01-01
    • 2020-03-31
    • 2016-08-22
    • 2011-06-06
    相关资源
    最近更新 更多