我被困在一个案子中。我有场景(使用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();
}
}
答案 0 :(得分:0)
尝试致电:
square[j][j]->setAcceptedMouseButtons(...)
和
square[i][j]->show()
创建后。
如果您想更改悬停事件的颜色,也可以重新实现hoverEnterEvent()
和hoverLeaveEvent()
。
如果在悬停时需要按下鼠标按钮:将鼠标按下/向上事件中的按钮状态存储在变量中。 bool isMouseButtonDown
并在您的悬停事件处理程序中进行检查。
您还可以使用:QApplication :: mouseButtons()来检查按钮状态。