m0_58500263 2023-04-18 11:58 采纳率: 0%
浏览 104
已结题

QCustomPlot鼠标拖拽游标

我在y轴上添加了一个游标,想要通过鼠标来拖动游标在y轴上滑动

  • 写回答

5条回答 默认 最新

  • 野老 2023-04-18 13:58
    关注

    要实现在QCustomPlot上拖拽游标,可以这样做:

    1. 定义游标类,继承QGraphicsItem
     cpp
     class Cursor : public QGraphicsItem
     {
     public:
         Cursor();
         void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
     }; 
    
    1. 重写sceneEvent方法,检测鼠标按下和移动事件
     cpp
     void Cursor::sceneEvent(QEvent *event)
     {
         switch (event->type()) {
         case QEvent::GraphicsSceneMousePress:
             mousePressPosition = static_cast<QGraphicsSceneMouseEvent*>(event)->pos();
             break;
         case QEvent::GraphicsSceneMouseMove: 
             if (static_cast<QGraphicsSceneMouseEvent*>(event)->buttons() & Qt::LeftButton) {
                // 拖动游标
                QPointF position = static_cast<QGraphicsSceneMouseEvent*>(event)->pos();
                setPos(mapToParent(position - mousePressPosition)); 
             }
             break;
         }
         QGraphicsItem::sceneEvent(event);
     }
    
    1. 重写mouseReleaseEvent结束拖拽
     cpp
     void Cursor::sceneEvent(QEvent *event) 
     {
         if (event->type() == QEvent::GraphicsSceneMouseRelease) {
             // 结束拖拽
             mousePressPosition = QPointF(); 
         }
     }
    
    
    1. 将游标添加到QCustomPlot的scene中
     cpp
     Cursor *cursor = new Cursor;
     customPlot->scene()->addItem(cursor);
    
    
    1. 重写QCustomPlot的mousePressEvent/MoveEvent/ReleaseEvent,转发给游标
     cpp
     void QCustomPlot::mousePressEvent(QMouseEvent *event)
     {
         if (cursor)
             cursor->sceneEvent(event);
         QCustomPlot::mousePressEvent(event);
     }
     
     void QCustomPlot::mouseMoveEvent(QMouseEvent *event) 
     {
         if (cursor)
             cursor->sceneEvent(event);
         QCustomPlot::mouseMoveEvent(event);
     }
     
     void QCustomPlot::mouseReleaseEvent(QMouseEvent *event)
     {
         if (cursor) 
             cursor->sceneEvent(event);
         QCustomPlot::mouseReleaseEvent(event);
     }
    
    

    这样,当用户在QCustomPlot上单击并拖动鼠标时,会触发游标的sceneEvent方法,从而实现游标的拖拽效果。

    希望这个示例能帮助您实现QCustomPlot上拖拽游标的需求。如有任何其他问题,欢迎在评论中提出。

    评论

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?