【问题标题】:C++ QT Event: Access outer class' private variables from inner nested classC++ QT 事件:从内部嵌套类访问外部类的私有变量
【发布时间】:2021-01-05 17:07:31
【问题描述】:

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

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

ma​​in.cpp

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

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

ma​​inwindow.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

ma​​inwindow.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;
             ^

【问题讨论】:

    标签: c++ qt private inner-classes friend


    【解决方案1】:

    您需要一个 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"));
    }
    

    【讨论】:

    • 感谢您的回复。我已经尝试过static int a;,它给出了错误undefined reference to 'MainWindow::a'。第二种解决方案,我不确定如何修改 myGraphicsPixmapItem(QPixmap pixmap): QGraphicsPixmapItem(pixmap) {}; 以考虑传入 MainWindow 实例。
    • 那是因为你必须定义静态实例。我将对我的帖子进行编辑。
    • 我还添加了一个编辑以显示有关第二个选项的更多详细信息。
    • 第一个解决方案给出了新的错误error: qualified-id in declaration before ‘=’ token int MainWindow::a = 0;。幸运的是,您的第二个解决方案完美运行!请注意,a=0; 也需要更改为 m_window-&gt;a = 0;。这对我很有帮助,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2014-02-11
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多