Qt: как вызвать указатель главного окна из другого класса? - PullRequest
0 голосов
/ 31 мая 2018

Я хочу разделить свои роли в игре на разные файлы .cpp и .h, но у меня возникают проблемы с вызовом указателя в главном окне из другого класса, который я добавил через scene-> add () в mainwindow.cpp.

Это показывает, что "игрок" не был объявлен в этой области , когда я бегу.

Я знаю, этот вопрос кажется довольноосновные, но я старался изо всех сил, чтобы исправить это без результатов.

Ниже перечислены основные методы, которые я пробовал:

  • add MainWindow :: перед проигрывателем, но показывает аналогичную ошибку, что основное окно не объявлено в этой области .
  • исправление проигрыватель в указатель , и он говорит, что у класса Player нет такого члена.
  • исправляет player в pos () указатель, он говорит pos ()не объявляется в этой области
  • установить класс Player как друга в главном окне, но ничего не изменится

Вот код:

main window.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;
}

главное окно. H

#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 голосов
/ 31 мая 2018

Вы путаетесь между двумя разными вещами.

У вас есть 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 в списке инициализации члена, а не делать это в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...