我正在使用Qt和c ++开始初学者(非基于类)项目。该项目的主要目标是学习设计模式。但在我开始学习如何使用和实现不同的设计模式以改进代码之前,我必须首先完成没有任何设计模式的工作实现!我想设计和实现一个由一个大矩形和两个较小的矩形组成的对象,每个矩形连接到主矩形的右上角和左上角。假设主矩形是玩家的身体,两个较小的矩形代表玩家的右臂和左臂。当前代码允许我初始化大矩形并使用键盘将其移动到左侧或右侧。
这是我的首发.h:
#ifndef PLAYER_H
#define PLAYER_H
#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QKeyEvent>
#include <QDebug>
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); //error: reference to type 'const QBrush' could not bind to an rvalue of type 'Qt::GlobalColor' setBrush(Qt::black);
}
void Player::keyPressEvent(QKeyEvent * event)
{
//qDebug() << "Player knows you pressed a buton";
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 <QObject>
#include <QGraphicsView>
#include <QTimer>
#include <Player.h>
#include <QPainter>
#include <QColor>
#include <QKeyEvent>
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();
}
我有几个问题,我会感谢任何帮助或任何提示。
1)每当我尝试在播放器的类中使用setBrush设置颜色时,我会收到一个错误(如上所示(setBrush(Qt :: black))行旁边的.cpp文件。但是,如果我在main函数中实现相同的行,它就可以工作。任何想法为什么会这样?我还是喜欢在类中而不是在main函数中设置颜色,无论如何做到这一点? / p>
2)组合可以让我能够在玩家的课程中初始化多个矩形。但是,如果我尝试使用合成而不是继承,我将无法移动到玩家的主矩形中!这有什么解释吗?如何保持使用合成而不是继承来移动玩家的能力?这是包含组合的代码。
·H:
#ifndef PLAYER_H
#define PLAYER_H
#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QKeyEvent>
#include <QDebug>
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);
//setBrush(Qt::black); //error: reference to type 'const QBrush' could not bind to an rvalue of type 'Qt::GlobalColor' setBrush(Qt::black);
}
void Player::keyPressEvent(QKeyEvent * event)
{
//qDebug() << "Player knows you pressed a buton";
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 <QObject>
#include <QGraphicsView>
#include <QTimer>
#include <Player.h>
#include <QPainter>
#include <QColor>
#include <QKeyEvent>
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();
}
3)假设有一种方法可以使用合成并允许移动玩家的主矩形(curRect),我可以轻松添加两个矩形并相应地设置它们的位置。然而,主要的挑战是,如何连接三个矩形以呈现一个而不是三个组件?我需要他们三个一起移动。
我非常感谢任何反馈或指示。 QT很有趣,我希望能够更多地了解它的功能。
最佳,
答案 0 :(得分:1)
我没有qt库的经验,但似乎在你在“Player.h”中使用的“QGraphicsItem”库中,setbrush被定义为:
void setBrush(const QBrush &brush)
但是在其他一些库中,例如“QPen”,这个函数会重载如下:
void QPainter::setBrush ( const QColor & color )
请参阅:http://doc.qt.io/archives/qt-4.8/qpen.html
因此,在您的主要文件中,您所包含的qt文件可能会接受(const QColor)作为参数的setBrush的重载版本。