Я могу заставить keyPressEvent работать с Inheritance, но не могу заставить его работать с композицией (Qt)

Описание проблем:

  • Я проектирую класс игрока. Этот класс проигрывателя может наследоваться от QGraphicsRectItem ИЛИ может иметь член QGraphicsRectItem (состав).
  • Когда проигрыватель наследует от QGraphicsRectItem, я могу реализовать keyPressEvent, перемещая проигрыватель вправо или влево.
  • Когда у игрока есть член QGraphicsRectItem, я не могу реализовать keyPressEvent, перемещая игрока вправо или влево.

код:

A] Случай наследования:

.h файл:

#ifndef PLAYER_H
#define PLAYER_H


#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QKeyEvent>
#include <QDebug>
#include <QPainter>

class Player : public QObject, public QGraphicsRectItem{
    Q_OBJECT //Macro


public:
    Player();
    void keyPressEvent(QKeyEvent * event);

};
#endif // PLAYER_H

Файл.cpp:

#include "Player.h"


Player::Player(){
    setRect(0, 0, 100, 100);
    setBrush(Qt::black);
}


void Player::keyPressEvent(QKeyEvent * event)
{
    qDebug() << "Player senses left arrow and right arrow presses.";
    if(event->key() == Qt::Key_Left){
        if(pos().x() > 0)
            setPos(x()-50, y());
    } else if (event->key() == Qt::Key_Right){
        if(pos().x() + rect().width() < 1200)
            setPos(x()+50, y());
    }
}

главный:

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>

#include "Player.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //has a session
    QGraphicsScene * scene = new QGraphicsScene();;
    //has a view
    QGraphicsView * view = new QGraphicsView(scene);;
    //has a player
    Player * player = new Player();;


    //Add player to a session
    scene -> addItem(player);


    //Make player focusable
    player->setFlag(QGraphicsItem::ItemIsFocusable);
    player->setFocus();


    //set coordinates
    view->setFixedSize(1200, 600);
    scene->setSceneRect(0, 0, 1200, 600);
    player->setPos(view->width()/2-((player->rect().width())/2), view->height()-player->rect().height());

    // a view is invisible by default, you have to show it
    view->show();

    return a.exec();
}

Б] Состав дела:

.h файл:

#ifndef PLAYER_H
#define PLAYER_H

#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QKeyEvent>
#include <QDebug>
#include <QPainter>


class Player : public QObject{
    Q_OBJECT //Macro!

public:
    QGraphicsRectItem * curRect;
    Player();
    void keyPressEvent(QKeyEvent * event);

};

#endif // PLAYER_H

.cpp:

#include "Player.h"

Player::Player(){
    curRect = new QGraphicsRectItem;
    curRect->setRect(0, 0, 100, 100);
    curRect->setBrush(Qt::black);
}


void Player::keyPressEvent(QKeyEvent * event)
{
    qDebug() << "Player senses left arrow and right arrow presses.";
    if(event->key() == Qt::Key_Left){
        if(curRect->pos().x() > 0)
            curRect->setPos(curRect->x()-50, curRect->y());
    } else if (event->key() == Qt::Key_Right){
        if(curRect->pos().x() + curRect->rect().width() < 1200)
            curRect->setPos(curRect->x()+50, curRect->y());
    }
}

главный:

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>

#include "Player.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //has a session
    QGraphicsScene * scene = new QGraphicsScene();;
    //has a view
    QGraphicsView * view = new QGraphicsView(scene);;
    //has a player
    Player * player = new Player();;


    //Add player to a session, set its initial position and color
    scene -> addItem(player->curRect);


    //Make player focusable
    player->curRect->setFlag(QGraphicsItem::ItemIsFocusable);
    player->curRect->setFocus();


    //set coordinates
    view->setFixedSize(1200, 600);
    scene->setSceneRect(0, 0, 1200, 600);
    player->curRect->setPos(view->width()/2-((player->curRect->rect().width())/2), view->height()-player->curRect->rect().height());

    // a view is invisible by default, you have to show it
    view->show();

    return a.exec();
}

QDebug подтверждает вышеуказанную проблему. Интересно, почему это? Очень важно, чтобы я использовал композицию, а не наследование, потому что у игрока будут другие компоненты, и я хочу избежать множественного наследования. Любая помощь с устранением неполадок очень ценится.

Чао.

0 ответов

Другие вопросы по тегам