C ++ QT事件:从内部嵌套类访问外部类的私有变量

问题描述

下面是有效的C ++ QT代码,该代码显示带有鼠标事件的图像。为了实现事件,我在MainWindow类中嵌套了一个自定义QGraphicspixmapItem类。我遇到的问题是从a内部类的事件函数内部访问和修改MainWindow外部类中的私有变量MainWindow::myGraphicspixmapItem。我尝试通过引用或使用mainWindow传递friend class失败。

我正在使用How to get mouse press event on a QPixmap中的事件实现,但也尝试过事件过滤器,但运气不佳。帮助表示赞赏。

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc,char *argv[ ])
{
QApplication app(argc,argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QCoreApplication>
#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicspixmapItem>

class MainWindow : public QMainWindow
{
        Q_OBJECT;
    public:
        explicit MainWindow(QWidget *parent = 0);
    private:
        QGraphicsScene *scene;
        QGraphicsView *view;
        int a; //inaccessible from myGraphicspixmapItem
        class myGraphicspixmapItem;
        QGraphicspixmapItem *img;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

class MainWindow::myGraphicspixmapItem: public QGraphicspixmapItem {
public:
    myGraphicspixmapItem(Qpixmap pixmap): QGraphicspixmapItem(pixmap) {};
    ~myGraphicspixmapItem() {};
    void mouseReleaseEvent(QGraphicsSceneMouseEvent* event){
        qDebug("Mouse release Detected!");
        a = 0; //problem
    };
    void mousepressEvent(QGraphicsSceneMouseEvent* event) {
        qDebug("Mouse press Detected!");
    };
};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    view = new QGraphicsView(this);
    scene = new QGraphicsScene;
    view->setScene(scene);
    setCentralWidget(view);
    img = new myGraphicspixmapItem(Qpixmap(":/img.bmp"));
    scene->addItem(img);
}

错误消息

mainwindow.cpp: In member function ‘virtual void MainWindow::myGraphicspixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent*)’:
mainwindow.cpp:9:9: error: invalid use of non-static data member ‘MainWindow::a’
         a = 0;
         ^
In file included from mainwindow.cpp:1:0:
mainwindow.h:18:13: note: declared here
         int a;
             ^

解决方法

您需要一个MainWindow类的实例才能引用它的非静态成员。因此,快速的解决方法是将a设为静态:

// mainwindow.h
class MainWindow
{
private:
    static int a;
}

// mainwindow.cpp
int MainWindow::a = 0;

如果这对您不起作用,则可能需要将MainWindow实例传递到myGraphicsPixmapItem构造函数中并存储指向它的成员指针。

class MainWindow::myGraphicsPixmapItem: public QGraphicsPixmapItem {
public:
    myGraphicsPixmapItem(MainWindow *window,QPixmap pixmap)
        : QGraphicsPixmapItem(pixmap),m_window(window)
    {}
private:
    MainWindow *m_window;
};

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    img = new myGraphicsPixmapItem(this,QPixmap(":/img.bmp"));
}