21

我继承了 QGraphicsScene 并添加了方法 mouseMoveEvent 来处理鼠标移动事件。我在 GraphicsView 之上创建了一个标尺,并让标尺跟踪鼠标移动。在 QGraphicsScene::mousemoveEvent 中,我明确地调用了标尺小部件的 mouseMoveEvent。目的是让标尺知道当前鼠标位置。

现在,当我移动鼠标时,似乎没有调用 QGraphicsScene::mousemoveEvent 。但是,如果我按下鼠标左键并在按住按钮的同时移动它,我可以让它工作。这不是我想看到的;我希望每当我将鼠标放在视图上并移动鼠标时都会调用此方法。

有什么解决方法吗?

4

2 回答 2

13

QGraphicsView文档中所述,视图负责将鼠标和键盘事件转换为场景事件并将其传播到场景:

您可以使用鼠标和键盘与场景中的项目进行交互。QGraphicsView 将鼠标和按键事件转化为场景事件,(继承QGraphicsSceneEvent的事件),并转发到可视化场景。

由于默认情况下鼠标移动事件仅在按下按钮时发生,因此您需要首先setMouseTracking(true)在视图上生成移动事件,以便它可以将这些事件转发到场景。
或者,如果您不需要转换到场景坐标,您可以mouseMoveEvent直接在视图中重新实现,而不是在场景中。但在这种情况下,请确保QGraphicsView::mouseMoveEvent在实现中调用基类,以便为场景中的项目正确生成悬停事件。

于 2012-05-28T07:25:22.657 回答
3

我一直在问,并在某个地方找到了一些有用的信息,并测试写了这个:

tgs.cpp

#include <QtGui>
#include "tgs.h"
#define _alto  300
#define _ancho 700
#include <QGraphicsSceneMouseEvent>

TGs::TGs(QObject *parent)
    :QGraphicsScene(parent)
{ // Constructor of Scene
    this->over = false;
}

void TGs::drawBackground(QPainter *painter, const QRectF &rect)
{

#define adjy 30
#define adjx 30

    int j = 0;
    int alto = 0;

    QPen pen;
    pen.setWidth(1);
    pen.setBrush(Qt::lightGray);
    painter->setPen(pen);   

    painter->drawText(-225, 10, this->str);
    alto = _alto;  // 50 + 2

    for(int i = 0; i < alto; ++i)
    {
        j = i * adjy - 17;

        painter->drawLine(QPoint(-210, j), QPoint(_ancho, j));
    }

    for(int i = 0; i < 300; ++i)
    {
        j = i * adjx - 210;

        painter->drawLine(QPoint(j, 0), QPoint(j, _ancho * 2));
    }
}

void TGs::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    QString string = QString("%1, %2")
               .arg(mouseEvent->scenePos().x())
              .arg(mouseEvent->scenePos().y()); // Update the cursor position text
    this->str = string;
    this->update();
}

void TGs::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    this->update();
}

void TGs::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    this->update();
}

tgs.h

#ifndef TGS_H
#define TGS_H

#include <QObject>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsTextItem>

QT_BEGIN_NAMESPACE

class QGraphicsSceneMouseEvent;
class QMenu;
class QPointF;
class QGraphicsLineItem;
class QFont;
class QGraphicsTextItem;
class QColor;

QT_END_NAMESPACE

class TGs : public QGraphicsScene
{
public:
    TGs(QObject *parent = 0);

public slots:
    void drawBackground(QPainter *painter, const QRectF &rect);
    void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

    bool over;
    QString str;
    QGraphicsTextItem cursor;
};

#endif // TGS_H
于 2013-03-29T08:07:54.893 回答