मैं एक गेम में अपनी भूमिकाओं को अलग-अलग .cpp और .h फाइलों में अलग करना चाहता हूं, लेकिन मुझे किसी अन्य वर्ग से मेनविंडो में पॉइंटर को कॉल करने में परेशानी होती है, जिसे मैंने मेनविंडो.सीपीपी में scene->add() के माध्यम से जोड़ा है।

यह दिखाता है कि "खिलाड़ी" इस दायरे में घोषित नहीं किया गया था जब मैं दौड़ता हूं।

मुझे पता है कि यह प्रश्न बहुत ही बुनियादी लगता है, लेकिन मैंने इसे बिना किसी परिणाम के ठीक करने की पूरी कोशिश की है।

निम्नलिखित मुख्य विधियां हैं जिन्हें मैंने आजमाया है:

  • खिलाड़ी से पहले MainWindow:: जोड़ें, लेकिन यह समान त्रुटि दिखाता है कि मेनविंडो को इस दायरे में घोषित नहीं किया गया है
  • खिलाड़ी को इस सूचक में संशोधित करें, और यह कहता है कि कक्षा खिलाड़ी का ऐसा कोई सदस्य नहीं है।
  • खिलाड़ी को pos() सूचक में संशोधित करें, यह कहता है कि pos() नहीं है इस दायरे में घोषित किया गया
  • क्लास प्लेयर को मुख्य विंडो के साथ मित्र के रूप में सेट करें, लेकिन कुछ भी नहीं बदलता है

यहाँ कोड है:

मुख्य विंडो.सीपीपी

#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

खिलाड़ी.सीपीपी

#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;
                 }
}

खिलाड़ी.एच

#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
bulge teeth 31 मई 2018, 07:01

1 उत्तर

सबसे बढ़िया उत्तर

आप दो अलग-अलग चीजों के बीच भ्रमित हो रहे हैं।

आपके पास एक class Player है, जो मुझे लगता है कि आप mainwindow.h में घोषित करना चाहते हैं, लेकिन class Player का ऑब्जेक्ट कहीं भी नहीं बनाया गया है (जहां तक ​​​​ऊपर दिखाया गया है)।

player वर्तमान में mainwindow.h में घोषित QGraphicsItem प्रकार का है और आपके द्वारा बनाए गए Player वर्ग का नहीं है, इसलिए आप अपने keyPressEvent पर काम करने की उम्मीद नहीं कर सकते हैं। यह।

आपको अपने डिजाइन पर एक बार फिर से नजर डालने की जरूरत है, Player वर्ग के उद्देश्य को जानें, यह जिम्मेदारियां हैं। वर्तमान में यह एक साधारण वर्ग है जो किसी भी चीज़ से विरासत में नहीं मिला है, क्या आप इसे QGraphicsItem से प्राप्त करना चाहते हैं।

ऐसे मामले में, आपकी कक्षा शायद कुछ इस तरह दिख सकती है:

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

और आपके mainwindow.h में, आप QGraphicsItem इंस्टेंस का उपयोग करने के बजाय केवल Player के इंस्टेंस का उपयोग कर सकते हैं।

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

अतिरिक्त संकेत :

१. मुझे Player वर्ग के mainwindow.h में friend वर्ग होने का कोई कारण नहीं दिखता, लेकिन फिर यह आपका डिज़ाइन है।

२. player ऑब्जेक्ट पार्ट को कंस्ट्रक्टर में करने के बजाय सदस्य इनिशियलाइज़ेशन लिस्ट में इनिशियलाइज़ करना पसंद करते हैं।

2
Vishaal Shankar 31 मई 2018, 09:29