我想将游戏中的角色分成不同的.cpp和.h文件, 但我在另一个类中调用mainwindow中的指针时遇到了麻烦,我在mainwindow.cpp中通过 scene-> add()添加了该指针。
我在运行时显示 “播放器”未在此范围内声明 。
我知道这个问题看起来非常基本,但我已经尽力修复它而没有结果。
以下是我尝试过的主要方法:
以下是代码:
主窗口.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
答案 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
对象部分,而不是在构造函数中进行。