zoukankan      html  css  js  c++  java
  • Qt QGraphicsItem 鼠标点击事件编程方法

    功能需求,在QGraphicsView中显示一张图像,如下图,鼠标点击图片时返回图片坐标系内的像素坐标,但是点击边上空白部分时不返回坐标。
    这里写图片描述
    实现思路是子类化QGraphicsView,QGraphicsScene, QGraphicsPixmapItem,并重写鼠标点击事件函数mousePressEvent(QGraphicsSceneMouseEvent* event)。光标默认的样式是手型样式以便拖拽图片。这里我更改了鼠标的样式,变为十字型,并且关闭了拖拽图片的功能。具体的实现方式见博文: QGraphicsView改变光标的样式。

    但是在重写鼠标点击事件函数时发现鼠标点击事件在子类化后的QGraphicsScene中被响应,但是子类化后的QGraphicsPixmapItem无法响应。QGraphicsView的事件传递机制的顺序是View->Scene->Item,也就是说事件被子类化的QGraphicsScene吞没了,没有传递到下一级的Item。
    解决方案,在子类化的QGraphicsScene中重写mousePressEvent()方法内部一定要要记得调用:

    QGraphicsScene::mousePressEvent(event);

    注意,要想返回图像坐标系的位置,就需要在子类化的QGraphicsPixmapItem中调用scenePos()函数。即使放大图像,点击图像中相同位置也会返回相同坐标结果。

    关键代码如下:
    子类化QGraphicsScene

     1 ImageScene::ImageScene(QObject* parent): QGraphicsScene(parent)
     2 {
     3 }
     4 
     5 ImageScene::~ImageScene()
     6 {
     7 }
     8 
     9 void ImageScene::mousePressEvent(QGraphicsSceneMouseEvent* event)
    10 {
    11     QGraphicsScene::mousePressEvent(event); // 将点击事件向下传递到item中
    12 }

    子类化QGraphicsPixmapItem

     1 ImageItem::ImageItem(QGraphicsItem *parent): ImageItem(parent)
     2 {
     3 }
     4 
     5 ImageItem::ImageItem(const QPixmap& pixmap, QGraphicsItem* parent) : QGraphicsPixmapItem(pixmap, parent)
     6 {
     7 }
     8 
     9 ImageItem::~ImageItem()
    10 {
    11 }
    12 
    13 void ImageItem::mousePressEvent(QGraphicsSceneMouseEvent* event)
    14 {
    15     std::cout << "Item: (" << event->scenePos().x() << ", " << event->scenePos().y() << ')' << std::endl; 
    16 }

    使用方法

    1 ImageView* view = new ImageView(); // 子类化的QGraphicsView
    2 ImageScene* scene = new ImageScene();
    3 ImageItem* imageItem = new ImageItem(QPixmap::fromImage(image));
    4 scene->addItem(imageItem);
    5 view->setScene(scene);

    如果在ImageScene的点击事件中调用scenePos(), 同时点击周围白色边框将会返回坐标结果,此时坐标系原点为显示图像的左上角。换而言之,图像左侧空白区域内坐标的x均为负值,上方空白区域内坐标的y均为负值,右侧空白区域内坐标的x大于图像宽度,下方空白区域内坐标的y大于图像高度。

  • 相关阅读:
    Ensemble.Tofino运行报错Unexpected java bridge exception的解决
    【Flex Viewer】源码介绍(3)Flex Viewer架构解析
    【Flex Viewer】源码介绍(1)Flex Viewer简介
    【Flex Viewer】 开发教程(4)Widget与WidgetTemplate
    【Flex Viewer】源码介绍(2)Flex Viewer源码包结构
    Flex与.NET互操作:基于WebService的数据访问
    浅谈我对几个Web前端开发框架的比较【转帖】
    11个GIS相关的iphone应用程序(Apps)
    【Flex Viewer】 开发教程(1)Flex Viewer配置文件
    VS2010 设置include路径
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13521750.html
Copyright © 2011-2022 走看看