我对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();
}
答案 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);
并将其连接到图形场景的信号。