QT:检测 QGraphicsItem 上的鼠标左键和右键按下事件



我在注册时遇到问题,右键单击我的自定义QGraphics项目。

我的自定义类的标头:

#ifndef TILE_SQUARE_H
#define TILE_SQUARE_H
#include <QPainter>
#include <QGraphicsItem>
#include <QtDebug>
#include <QMouseEvent>
class Tile_Square : public QGraphicsItem
{
public:
Tile_Square();
bool Pressed;
int MovementCostValue;
QRectF boundingRect() const;
void paint(QPainter *painter,const QStyleOptionGraphicsItem *option, QWidget *widget);

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void contextMenuEvent(QGraphicsSceneContextMenuEvent *cevent);

};
#endif // TILE_SQUARE_H

这是所述类的实现:

    #include "tile_square.h"
Tile_Square::Tile_Square()
{
    Pressed = false;
    MovementCostValue = 1;
}
QRectF Tile_Square::boundingRect() const
{
    return QRectF(0,0,10,10);
}
void Tile_Square::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QRectF rec = boundingRect();
    QBrush brush(Qt::white);
    painter->fillRect(rec,brush);
    painter->drawRect(rec);
}
//Left click
void Tile_Square::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QMouseEvent *mouseevent = static_cast<QMouseEvent *>(*event);
    if(mouseevent->buttons() == Qt::LeftButton){
        MovementCostValue++;
        qDebug() << "LEFT: Movement value is: " << MovementCostValue;
    }
    else if(mouseevent->buttons() == Qt::RightButton){
        MovementCostValue--;
        qDebug() << "RIGHT: Movement value is: " << MovementCostValue;
    }
    update();
    QGraphicsItem::mousePressEvent(event);

}

我正在带有图形视图和图形场景的对话框窗口中绘制此内容。

我想在左键单击时增加类的内部 int,并在右键单击时减少它。问题是,鼠标按下事件记录事件,而不是按下哪个按钮。在我的代码中,您可以看到我试图将其转换为常规鼠标事件,但显然失败了。

老实说,我想写

event->buttons() == Qt::LeftButton

但是QGraphicsSceneMouseEvent *event没有这样的事件。问题出在哪里?

我还尝试使用上下文菜单事件,它运行良好并记录了右键单击,但常规的鼠标按下事件也被注册。

首先,您不能从QGraphicsSceneMouseEvent转换为QMouseEventQGraphicsSceneMouseEvent不是从QMouseEvent衍生出来的,所以这不是一个安全的演员阵容。按钮方法实际上可能没有调用正确的方法,因为该强制转换是错误的。其次,QGraphicsSceneMouseEvent::buttons确实存在,它做你想做的事,但它是一个面具。你应该这样做:

#include <QGraphicsSceneMouseEvent>
void Tile_Square::mousePressEvent (QGraphicsSceneMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton)
    {
        // ... handle left click here
    }
    else if (event->buttons() & Qt::RightButton)
    {
        // ... handle right click here
    }
}

即使不将其视为面具,我希望只要您不一次按下按钮组合,您的直接比较可能会起作用。但是,我还没有测试过

相关内容

  • 没有找到相关文章

最新更新