gpt4 book ai didi

c++ - 将三个 QGraphicsRectItems 连接成一个对象

转载 作者:行者123 更新时间:2023-11-28 04:48:59 26 4
gpt4 key购买 nike

我正在逐步完成一个使用 Qt 和 C++ 的初学者(非基于类的)项目。该项目的主要目标是学习设计模式。但是在我开始学习如何使用和实现不同的设计模式以改进代码之前,我必须先有一个没有任何设计模式的工作实现!我想设计并实现一个由一个大矩形和两个小矩形组成的对象,每个矩形都连接到主矩形的右上角和左上角。假设主矩形是玩家的 body ,两个较小的矩形代表玩家的右臂和左臂。当前代码允许我初始化大矩形并使用键盘将其向左或向右移动。

这是我的起始.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 函数中设置颜色,关于如何做到这一点的任何方式?

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 很好玩,我希望能够更多地了解它的功能。

最好的,

最佳答案

我没有使用 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 的重载版本。

关于c++ - 将三个 QGraphicsRectItems 连接成一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48602448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com