将三个QGraphicsRectItems连接到一个对象

时间:2018-02-03 21:53:55

标签: c++ qt

我正在使用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很有趣,我希望能够更多地了解它的功能。

最佳,

1 个答案:

答案 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的重载版本。