问:如何从另一个类调用主窗口的指针?

时间:2018-05-31 04:01:10

标签: c++ qt

我想将游戏中的角色分成不同的.cpp和.h文件, 但我在另一个类中调用mainwindow中的指针时遇到了麻烦,我在mainwindow.cpp中通过 scene-> add()添加了该指针。

我在运行时显示 “播放器”未在此范围内声明

我知道这个问题看起来非常基本,但我已经尽力修复它而没有结果。

以下是我尝试过的主要方法:

  • 在播放器之前添加 MainWindow :: ,但它会显示类似的错误 主窗口未在此范围内声明
  • 播放器修改为指针,表示类播放器没有此类成员。
  • 播放器修改为 pos()指针,它说 pos()不是 在此范围内声明
  • 将类播放器设置为主窗口的朋友,但没有任何更改

以下是代码:

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    scene(new QGraphicsScene(0,0,800,600)),
    timer(new QTimer)
{
    ui->setupUi(this);
    ui->graphicsView->setScene(scene);

    player = new QGraphicsPixmapItem(QPixmap(":/img/whitedog.png").scaled(150,150));
    scene->addItem(player);
    player->setPos(0, 0);
    timer->start(10);
}

MainWindow::~MainWindow()
{
    delete ui;
}

主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QTimer>
#include <QKeyEvent>

#include "player.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);

    friend class Player;

    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QGraphicsScene *scene;
    QTimer *timer;
    QGraphicsItem *player;
};

#endif // MAINWINDOW_H

player.cpp

#include "player.h"

Player::Player()
{
}

void Player::keyPressEvent(QKeyEvent *e)
{

       switch(e->key()) {

       case Qt::Key_Up:
               player->setPos(player->x(), player->y()-10);
           break;
                 }
}

player.h

#ifndef PLAYER_H
#define PLAYER_H

#include <QKeyEvent>
#include <QGraphicsScene>
#include <QMainWindow>
#include <QGraphicsPixmapItem>
#include <QTimer>

#include "ui_mainwindow.h"


class Player
{

public:
    Player();
    void keyPressEvent(QKeyEvent *e);
};

#endif // PLAYER_H

1 个答案:

答案 0 :(得分:1)

你在两件事之间感到困惑。

您有一个class Player,我相信您要在mainwindow.h中声明,但class Player的对象不会在任何地方创建(就上面显示的内容而言) )。

player中当前声明的mainwindow.h类型为QGraphicsItem,而不是您创建的Player类,因此您不能指望keyPressEvent努力工作。

您需要重新审视您的设计,了解Player课程的目的,它的职责。目前它是一个简单的类,不能继承任何东西,你希望它可能继承自QGraphicsItem

在这种情况下,你的班级可能看起来像这样:

class Player : public QGraphicsItem
{
   //Players's responsibilities.
}

在您的mainwindow.h中,您只需使用Player的实例,而不是使用QGraphicsItem实例。

class MainWindow : public QMainWindow
{
  ...// other stuff
  private:
  Player *player;
}

其他指针:

1。我没有看到Player课程在friend中成为mainwindow.h课程的原因,但这又是您的设计。

2。首选初始化成员初始化列表中的player对象部分,而不是在构造函数中进行。