一、使用场景
QGraphicsView 是 Qt 的图形视图组件,在 UI 设计器的 Display Widget 分组里可以拖放一个 QGraphicsView 组件到窗口上。但遇到下面的场景时:当鼠标在 QGraphicsView 上移动时就显示当前光标的坐标,这涉及到 mouseMoveEvent() 事件的处理。但是 QGraphicsView 并没有与 mouseMoveEvent() 相关的信号,因而无法定义槽函数与此事件相关联。
为此,从 QGraphicsView 继承定义一个类 QwGraphicsView,实现 mouseMoveEvent() 事件和 mousePressEvent() 事件,并把鼠标事件转换为信号,这样就可以在主程序里设计槽函数响应这些鼠标事件。
二、使用
(一)自定义 QwGraphicsView 继承 QGraphicsView
QwGraphicsView定义如下:
QwGraphicsView .h
#include <QtWidgets/QWidget>
#include <QGraphicsView>
#include <QPoint>
#include <QMouseEvent>
/**
* QGraphicsView 有 mouseMoveEvent() 和 mousePressEvent() 事件,但是没有与之相关
* 的信号,所以这里继承该类,来绑定自定义信号:mouseMovePoint(QPoint point)、
* mouseClicked(QPoint point)
*/
class QwGraphicsView :
public QGraphicsView
{
Q_OBJECT
protected:
void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
public:
QwGraphicsView(QWidget* parent = 0);
signals:
void mouseMovePoint(QPoint point);
void mouseClicked(QPoint point);
};
QwGraphicsView .cpp
#include "QwGraphicsView.h"
QwGraphicsView::QwGraphicsView(QWidget* parent):QwGraphicsView(parent)
{
}
void QwGraphicsView::mouseMoveEvent(QMouseEvent* event)
{
QPoint point = event->pos();
emit mouseMovePoint(point);
QGraphicsView::mouseMoveEvent(event);
}
void QwGraphicsView::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
QPoint point = event->pos();
emit mouseClicked(point);
}
QGraphicsView::mousePressEvent(event);
}
(二)将 QGraphicsView 升级为 QwGraphicsView
在设计界面时,先从组件面板里放一个 QGraphicsView 组件到窗口上,然后选中该组件右击,在快捷菜单中选择 “提升为…”,出现如下图对话框。在其中选择基类名称 QGraphicsView ,升级类名称输入 QwGraphicsView,然后单击 “添加” 按钮,再点击 “提升” 按钮,就可以将窗口上的 QGraphicsView 组件升级为 QwGraphicsView 组件,使用自定义事件和信号。