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

Qt: How do I notify changing mouse coordinates to parent object

我对 Qt 有点小问题 class QGraphicsScene: 为了检测当前的鼠标坐标,我用 QGraphicsScene 作为基础 class 创建了一个新的 class QGraphicsScenePlus。我已经重新定义了槽函数 mouseMoveEvent(QGraphicsSceneMouseEvent* event) 并且接收到的坐标似乎是正确的。现在我想通知父 QMainWindow class,存储 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. 即使你从 QObject 子class,你仍然需要 Q_OBJECT 宏来保持元对象编译器通知:

class QGraphicsScenePlus : public QGraphicsScene {

    Q_OBJECT    // <--- You miss this

public:
    QGraphicsScenePlus(QObject* parent = 0);

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

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

解决方案

关于你的问题:

What is the best way to do this? I already tried to define signals and slots, but it didn't work.

最好的方法仍然是信号与槽

代码

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);

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

演示