QGraphicsItem 鼠标点击事件编程方法
2017-12-31 22:56
330 查看
功能需求,在QGraphicsView中显示一张图像,如下图,鼠标点击图片时返回图片坐标系内的像素坐标,但是点击边上空白部分时不返回坐标。
![](https://img-blog.csdn.net/20171231225617381?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTWVuZ2NoaUNNQw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
实现思路是子类化QGraphicsView,QGraphicsScene, QGraphicsPixmapItem,并重写鼠标点击事件函数mousePressEvent(QGraphicsSceneMouseEvent* event)。光标默认的样式是手型样式以便拖拽图片。这里我更改了鼠标的样式,变为十字型,并且关闭了拖拽图片的功能。具体的实现方式见博文: QGraphicsView改变光标的样式。
但是在重写鼠标点击事件函数时发现鼠标点击事件在子类化后的QGraphicsScene中被响应,但是子类化后的QGraphicsPixmapItem无法响应。QGraphicsView的事件传递机制的顺序是View->Scene->Item,也就是说事件被子类化的QGraphicsScene吞没了,没有传递到下一级的Item。
解决方案,在子类化的QGraphicsScene中重写mousePressEvent()方法内部一定要要记得调用:
注意,要想返回图像坐标系的位置,就需要在子类化的QGraphicsPixmapItem中调用scenePos()函数。即使放大图像,点击图像中相同位置也会返回相同坐标结果。
关键代码如下:
子类化QGraphicsScene
子类化QGraphicsPixmapItem
使用方法
如果在ImageScene的点击事件中调用scenePos(), 同时点击周围白色边框将会返回坐标结果,此时坐标系原点为显示图像的左上角。换而言之,图像左侧空白区域内坐标的x均为负值,上方空白区域内坐标的y均为负值,右侧空白区域内坐标的x大于图像宽度,下方空白区域内坐标的y大于图像高度。
实现思路是子类化QGraphicsView,QGraphicsScene, QGraphicsPixmapItem,并重写鼠标点击事件函数mousePressEvent(QGraphicsSceneMouseEvent* event)。光标默认的样式是手型样式以便拖拽图片。这里我更改了鼠标的样式,变为十字型,并且关闭了拖拽图片的功能。具体的实现方式见博文: QGraphicsView改变光标的样式。
但是在重写鼠标点击事件函数时发现鼠标点击事件在子类化后的QGraphicsScene中被响应,但是子类化后的QGraphicsPixmapItem无法响应。QGraphicsView的事件传递机制的顺序是View->Scene->Item,也就是说事件被子类化的QGraphicsScene吞没了,没有传递到下一级的Item。
解决方案,在子类化的QGraphicsScene中重写mousePressEvent()方法内部一定要要记得调用:
QGraphicsScene::mousePressEvent(event);
注意,要想返回图像坐标系的位置,就需要在子类化的QGraphicsPixmapItem中调用scenePos()函数。即使放大图像,点击图像中相同位置也会返回相同坐标结果。
关键代码如下:
子类化QGraphicsScene
ImageScene::ImageScene(QObject* parent): QGraphicsScene(parent) { } ImageScene::~ImageScene() { } void ImageScene::mousePressEvent(QGraphicsSceneMouseEvent* event) { QGraphicsScene::mousePressEvent(event); // 将点击事件向下传递到item中 }
子类化QGraphicsPixmapItem
ImageItem::ImageItem(QGraphicsItem *parent): ImageItem(parent) { } ImageItem::ImageItem(const QPixmap& pixmap, QGraphicsItem* parent) : QGraphicsPixmapItem(pixmap, parent) { } ImageItem::~ImageItem() { } void ImageItem::mousePressEvent(QGraphicsSceneMouseEvent* event) { std::cout << "Item: (" << event->scenePos().x() << ", " << event->scenePos().y() << ')' << std::endl; }
使用方法
ImageView* view = new ImageView(); // 子类化的QGraphicsView ImageScene* scene = new ImageScene(); ImageItem* imageItem = new ImageItem(QPixmap::fromImage(image)); scene->addItem(imageItem); view->setScene(scene);
如果在ImageScene的点击事件中调用scenePos(), 同时点击周围白色边框将会返回坐标结果,此时坐标系原点为显示图像的左上角。换而言之,图像左侧空白区域内坐标的x均为负值,上方空白区域内坐标的y均为负值,右侧空白区域内坐标的x大于图像宽度,下方空白区域内坐标的y大于图像高度。
相关文章推荐
- android编程添加点击事件的4种方法
- cocoa编程,窗口响应鼠标点击事件
- canvas绑定事件的时候 获得鼠标点击的地方在canvas画布内的坐标的方法
- QTreeWidget区分鼠标左右键点击事件的方法
- 简单讲解Android开发中触摸和点击事件的相关编程方法
- Android编程出现Button点击事件无效的解决方法示例
- iOS 利用运行时交换系统方法实现禁止同时点击两个按钮触发多个事件
- ActiveX控件在浏览器中的鼠标键盘事件处理方法
- jQuery on()方法绑定动态元素的点击事件实例代码浅析
- Android中的WebView禁止响应点击事件的方法
- WinForm中,Button按钮有PerformClick()方法,可以模拟用户单击鼠标. 即button.PerformClick()生成按钮的事件。
- JTabel选择表格事件监听时,用鼠标点击一次,会出现两次事件的原因。
- 元素绑定click点击事件方法
- Creator 添加触摸,鼠标,键盘事件方法
- unity OnMouseDown 不能监测鼠标右键点击事件
- 在Fragment中的子View(如Button等)点击事件失效解决方法
- 三种方法实现按钮的点击事件
- js鼠标事件解析——如何用js实现一个拖动但是不触发其点击事件
- mapabc高德地图显示多个点,并且每个marker点可以响应鼠标点击事件,处理跳转页面