C++ QT 事件:从内部嵌套 class 访问外部 class' 私有变量
C++ QT Event: Access outer class' private variables from inner nested class
下面是一个有效的 C++ QT 代码,它只显示带有鼠标事件的图像。为了实现这些事件,我在主窗口 class 中嵌套了一个自定义 QGraphicsPixmapItem class。我遇到的问题是从 MainWindow::myGraphicsPixmapItem
内部 class 的事件函数中访问和修改 MainWindow
外部 class 中的私有变量 a
。我尝试通过引用或使用 friend class
.
传递 mainWindow
但失败了
我正在使用 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
class 的实例才能引用它的 non-static 成员。所以快速修复是使 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"));
}
下面是一个有效的 C++ QT 代码,它只显示带有鼠标事件的图像。为了实现这些事件,我在主窗口 class 中嵌套了一个自定义 QGraphicsPixmapItem class。我遇到的问题是从 MainWindow::myGraphicsPixmapItem
内部 class 的事件函数中访问和修改 MainWindow
外部 class 中的私有变量 a
。我尝试通过引用或使用 friend class
.
mainWindow
但失败了
我正在使用 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
class 的实例才能引用它的 non-static 成员。所以快速修复是使 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"));
}