• QGraphicsView自定义游标【解决修改光标样式不起作用】


            QGraphicsView中如果我们设置了setDragMode(QGraphicsView::ScrollHandDrag),启用拖拽功能。游标(光标)的样式默认是Qt::OpenHandCursor。如图:

            我们想实现的功能是, 当光标悬浮时处于箭头状态,按下鼠标左键再显示成手形样式。如下图我们想要的效果。

             我们在继承自QGraphicsView类的子类中使用this->setCursor(Qt::ArrowCursor)是不起作用的。原因是QGraphicsView继承自QAbstractScrollArea类,只能通过viewport()获取view Widget。所以在QGraphicsView子类中使用viewport()->setCursor()而不是直接setCursor(),这样才能真正改变视觉上的鼠标形状。viewport()函数定义在QAbstractScrollArea类中,对于更新视图内容应该用viewport()->update(),而不是直接用update()setDragMode(QGraphicsView::ScrollHandDrag)在默认实现中设置了鼠标样式,并且每次事件都会覆盖我们设置的样式。

    实现代码如下:

    1. GraphicsViewDrag::GraphicsViewDrag(QWidget* parent)
    2. : QGraphicsView(parent)
    3. {
    4. setStyleSheet("padding: 0px; border: 0px;");
    5. setMouseTracking(true);
    6. setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    7. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    8. setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
    9. setResizeAnchor(QGraphicsView::AnchorUnderMouse);
    10. setDragMode(QGraphicsView::ScrollHandDrag);//设置这里可以拖动
    11. //此处设置的效果只能在没有鼠标按下之前生效
    12. //一旦我们触发了鼠标事件,setDragMode(QGraphicsView::ScrollHandDrag)会覆盖我们的设置
    13. viewport()->setCursor(Qt::ArrowCursor);
    14. }

            为了解决setDragMode(QGraphicsView::ScrollHandDrag)覆盖我们的设置,我们必须重新实现mouseReleaseEvent(QMouseEvent *event)方法,在方法内先传递Release事件,让默认先覆盖,而后我们再设置样式,覆盖默认设置。代码如下:

    1. void GraphicsViewDrag::mouseReleaseEvent(QMouseEvent *event)
    2. {
    3. //这两句必须按这种顺序。如果先设置鼠标样式,再传递event,默认实现会覆盖我们的设置
    4. QGraphicsView::mouseReleaseEvent(event);
    5. viewport()->setCursor(Qt::ArrowCursor);
    6. }

  • 相关阅读:
    Python自动化测试实战 真实项目-Web自动化测试从方案到实战落地(二)
    discuzx3.4帖子表pre_forum_post中invisible字段说明
    Tomcat
    Docker面试
    golang gorm 增删改查以及使用原生SQL(以操作mysql为例)
    【无标题】
    ETL 与 ELT:哪一个适合您的业务?
    深入理解Spring四大元注解DIRT
    一个Linux主机巡检脚本
    Android源码编译原生模拟器
  • 原文地址:https://blog.csdn.net/weixin_40583088/article/details/127418389