Я могу заставить 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 подтверждает вышеуказанную проблему. Интересно, почему это? Очень важно, чтобы я использовал композицию, а не наследование, потому что у игрока будут другие компоненты, и я хочу избежать множественного наследования. Любая помощь с устранением неполадок очень ценится.
Чао.