Qt:如何通知将鼠标坐标更改为父对象

时间:2015-04-09 22:05:23

标签: qt mouseevent qgraphicsscene

我对Qt类QGraphicsScene有一点问题: 为了检测当前的鼠标坐标,我创建了一个以QGraphicsScenePlus为基类的新类QGraphicsScene。我已经重新定义了槽函数mouseMoveEvent(QGraphicsSceneMouseEvent* event),并且接收到的坐标似乎是正确的。现在,只要鼠标坐标发生变化,我就想要通知存储QMainWindow对象的父QGraphicsScenePlus类。做这个的最好方式是什么?我已经尝试定义信号和插槽,但它没有用。在执行程序期间找不到槽功能。

以下是目前的代码:

qgraphicssceneplus.h

#ifndef QGRAPHICSSCENEPLUS_H
#define QGRAPHICSSCENEPLUS_H

#include <QObject>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>

class QGraphicsScenePlus : public QGraphicsScene {

public:
    QGraphicsScenePlus(QObject* parent = 0);

public slots:
    void mouseMoveEvent(QGraphicsSceneMouseEvent* event);

public:
    int mx = 0;
    int my = 0;
};

#endif // QGRAPHICSSCENEPLUS_H

qgraphicssceneplus.cpp

#include "qgraphicssceneplus.h"

QGraphicsScenePlus::QGraphicsScenePlus(QObject* parent) : QGraphicsScene(parent) {

}


void QGraphicsScenePlus::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) {

    mx = mouseEvent->scenePos().x();
    my = mouseEvent->scenePos().y();

    this->update();
}

1 个答案:

答案 0 :(得分:1)

注释

我不确定你是如何编写上述代码的。

1。即使你是QObject的子类,你仍然需要Q_OBJECT宏来保持元对象编译器的通知:

class QGraphicsScenePlus : public QGraphicsScene {

    Q_OBJECT    // <--- You miss this

public:
    QGraphicsScenePlus(QObject* parent = 0);

2。不允许在C ++类定义中分配原始值,而是在构造函数中执行:

public:
    int mx /*= 0*/;
    int my /*= 0*/;
};

解决方案

关于你的问题:

  

最好的方法是什么?我已经尝试定义信号和插槽,但它没有工作。

最好的方法仍然是信号&amp;槽

代码

qgraphicssceneplus.h

class QGraphicsScenePlus : public QGraphicsScene {

    Q_OBJECT

public:
    QGraphicsScenePlus(QObject* parent = 0);

public slots:
    void mouseMoveEvent(QGraphicsSceneMouseEvent* event);

signals:
    void sendCoord(int,int);  // for sending the information of coordinates

public:
    int mx;
    int my;
};

qgraphicssceneplus.cpp

QGraphicsScenePlus::QGraphicsScenePlus(QObject* parent) : QGraphicsScene(parent) {

    mx = 0;
    my = 0;
}

void QGraphicsScenePlus::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) {

    mx = mouseEvent->scenePos().x();
    my = mouseEvent->scenePos().y();

    emit sendCoord(mx, my);  // emit the signal

    this->update();
}

要捕获信号,请在QMainWindow中定义插槽。例如:

public slots:
    void receiveCoord(int x, int y);

并将其连接到图形场景的信号。

演示

enter image description here