使用QGraphicsRectItem的颜色矩形

时间:2018-01-07 13:10:14

标签: c++ qt

我被困在一个案子中。我有场景(使用QGraphicsScene),我用方块填充那个场景(使用QGraphicsRectItem)。我希望将每个方形颜色变为黑色,因为我按下鼠标按钮将鼠标移动到方块上。能告诉我如何实现这一目标吗?我试图使用mousePressEvent,mouseMoveEvent,dragEnterEvent等来解决这个问题。我认为这是一种正确的方法,但我不知道如何推动它。为了更好地说明我的情况,我添加了我的代码示例。谢谢你的帮助。

的main.cpp

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include "square.h"
#include "background.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // create a scene
    QGraphicsScene * scene = new QGraphicsScene(0,0,200,250);


    Background * background = new Background();
    background->fillBackgroundWithSquares(scene);



    // add a view
    QGraphicsView * view = new QGraphicsView(scene);

    view->show();


    return a.exec();
}

background.h

#ifndef BACKGROUND_H
#define BACKGROUND_H
#include <QGraphicsScene>
#include <square.h>
class Background
{
public:
    Background();
    void fillBackgroundWithSquares(QGraphicsScene *scene);

};

#endif // BACKGROUND_H

background.cpp

#include "background.h"

Background::Background()
{

}

void Background::fillBackgroundWithSquares(QGraphicsScene *scene)
{
    // create an item to put into the scene
    Square *squares[20][25];


    // add squares to the scene
    for (int i = 0; i < 20; i++)
        for (int j = 0; j < 25; j++) {
            squares[i][j] = new Square(i*10,j*10);
            scene->addItem(squares[i][j]);
        }

}

square.h(编辑)

#ifndef SQUARE_H
#define SQUARE_H
#include <QGraphicsRectItem>
#include <QGraphicsView>


class Square : public QGraphicsRectItem
{
public:
    Square(int x, int y);

private:
    QPen pen;

protected:
    void hoverEnterEvent(QGraphicsSceneHoverEvent * event);


};

#endif // SQUARE_H

square.cpp(编辑)

#include "square.h"

Square::Square(int x, int y)
{
    // draw a square
    setRect(x,y,10,10);
    pen.setBrush(Qt::NoBrush);
    setPen(pen);
    setBrush(Qt::cyan);
    setAcceptHoverEvents(true);
    setAcceptedMouseButtons(Qt::LeftButton);
    show();
}

void Square::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{

    if ( brush().color() != Qt::black && QApplication::mouseButtons() == Qt::LeftButton)
    {
        setBrush( Qt::black );
        update();
    }

}

1 个答案:

答案 0 :(得分:0)

尝试致电:

square[j][j]->setAcceptedMouseButtons(...)

square[i][j]->show() 
创建后

如果您想更改悬停事件的颜色,也可以重新实现hoverEnterEvent()hoverLeaveEvent()

如果在悬停时需要按下鼠标按钮:将鼠标按下/向上事件中的按钮状态存储在变量中。 bool isMouseButtonDown并在您的悬停事件处理程序中进行检查。 您还可以使用:QApplication :: mouseButtons()来检查按钮状态。