Qt5鼠标事件

常用操作 

判断鼠标按下了哪个键

void Win::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)  //如果鼠标按下的键是左键
        //e->button()  返回鼠标当时按下的键--触发事件的键
        {
            qDebug()<<"按下了鼠标左键:"<<e->button();
        }
      if(e->button() == Qt::RightButton)   //如果鼠标按下的键是右键
        {
            qDebug()<<"按下了鼠标右键";
        }
    if(e->button() == Qt::MidButton)   //如果鼠标按下的键是中键
    {
        qDebug()<<"按下了鼠标中键";
    }


}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

设置鼠标跟踪

setMouseTracking(true);  //设置鼠标跟踪--不按住鼠标也能产生鼠标移动事件
    //默认是当按下鼠标按键时移动鼠标,鼠标移动事件才会产生
    //如果想不按鼠标按键,也可以获得鼠标移动事件,可以构造函数上添加这一行
    bool b=hasMouseTracking();  //返回鼠标跟踪状态
    qDebug()<<b;

鼠标移动事件

void Win::mouseMoveEvent(QMouseEvent *e)
{
    static int i=0;
    QPoint point;
    point=e->pos();  //返回鼠标的坐标(相对于控件)   QPoint(635,13)
    //每个Qwidget都能通过pos()获取到相对自己父类窗口的位置
    qDebug()<<"移动了鼠标:"<<i++<<"    "<<point;

    int x=e->pos().x(); //返回鼠标的x坐标(相对于控件)
    int y=e->pos().y();  //返回鼠标的y坐标(相对于控件)
    x=e->x();  //返回鼠标的x坐标(相对于控件)
    y=e->y();  //返回鼠标的y坐标(相对于控件)

    QPointF pointF;
    pointF=e->localPos();//返回鼠标的坐标(相对于控件)
    //QPointF(635,13)

    QPoint point1;
    QPoint point2;
    point1=mapToGlobal(point);  //将窗口坐标转换成屏幕坐标
    point2=mapFromGlobal(point1);   //将相对于屏幕的坐标转换成相对于窗口的坐标

    point2=e->globalPos(); //返回鼠标相对于屏幕的坐标
    /*
    mapToParent(QPoint) - 将窗口坐标转换成父窗口坐标。如果没有父窗口,则相当于mapToGlobal (QPoint)
    mapFromParent(QPoint) - 将父窗口坐标转换成窗口坐标。如果没有父窗口,则相当于mapFromGlobal(QPoint)
    mapTo (QWidget, QPoint) - 将窗口坐标转换成 QWidget父窗口坐标
    */

    x=e->globalX(); //返回相对于屏幕的x坐标
    y=e->globalY(); //返回相对于屏幕的y坐标

    pointF=e->windowPos();  //返回相对于窗口的坐标
    //QPointF(560,0)

    pointF=e->screenPos();  //相对于屏幕的坐标
    //QPointF(1266,280)

    int t;
    t=e->timestamp();  //返回事件发生的时间。【以程序运行开始计时,以毫秒为单位】


    qDebug()<<t;

}

鼠标双击事件

void Win::mouseDoubleClickEvent(QMouseEvent *e)
{
     //方法返回双击的时间间隔
    qDebug()<<"双击了鼠标";
    /*
双击时的事件顺序如下:
MouseButtonPress
MouseButtonRelease
MouseButtonDblClick
MouseButtonPress
MouseButtonRelease
setDoubleClickInterval( )方法可设置双击的时间间隔
doubleClickInterval( )方法返回双击的时间间隔
    */
}

鼠标滚轮事件

void Win::wheelEvent(QWheelEvent *e)
{
    QPoint point=e->angleDelta();  //返回滚轮转过的数值,单位为1/8度
    //QPoint(0,120)--向上滚     QPoint(0,-120)--向下滚

    point=point/8;  //除以8之后单位为度
    //QPoint(0,15)

    qDebug()<<point;
}
ev->pixelDelta(); //返回屏幕上以像素为单位的滚动距离。此值是在支持基于高分辨率像素的delta值的平台(如macos)上提供的。该值应直接用于在屏幕上滚动内容

鼠标按住事件

void Win::mousePressEvent(QMouseEvent *e)
{
    static int i=0;
    qDebug()<<e->button();
    //e->button()   只返回一个键--触发事件的键

    qDebug()<<e->buttons();
    //e->buttons()  返回的是鼠标的按键情况--返回哪些键被按下
    //QFlags<Qt::MouseButton>(LeftButton|RightButton)

    if(e->buttons() & Qt::LeftButton){  //如果按住了左键
        //e->buttons() & Qt::LeftButton  返回左键是否被按住
        qDebug()<<"你按下了左键:"<<i;
    }
    if(e->buttons() & Qt::LeftButton && e->buttons() & Qt::RightButton ){   //如果按住了左键和右键
        qDebug()<<"你按下了左键和右键:"<<i;
    }
    if(e->buttons() & Qt::LeftButton && e->buttons() & Qt::MidButton ){   //如果按住了左键和中键
        qDebug()<<"你按下了左键和中键:"<<i;
    }
    i++;
}

鼠标事件的来源 

Qt::MouseEventSource source() const; 返回鼠标事件的来源信息。鼠标事件除了可以来自于物理鼠标之外,还可以来自于其 他来源,比如触摸屏的仿真鼠标事件。鼠标事件的来源使用枚举Qt::MouseEventSource 来描述,该枚举可取以下值

捕获鼠标 

mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QDebug>
#include <QMouseEvent>

class MyButton : public QPushButton
{
public:
    MyButton();
    void mousePressEvent(QMouseEvent *e);
};

#endif // MYBUTTON_H

mybutton.cpp

#include "mybutton.h"

MyButton::MyButton()
{

}

void MyButton::mousePressEvent(QMouseEvent *e)
{
    static int i=0;
    qDebug()<<"button鼠标事件:"<<i;
    QWidget* ww= mouseGrabber(); //返回正在捕获鼠标输入的部件,若没有则返回 0
    //QPushButton(0x2f2f210)
    qDebug()<<"正在捕获的控件:"<<ww;

    bool b= this->underMouse(); //若部件位于鼠标光标之下,则返回 true,否则返回 false
    //【这个函数:在鼠标被捕获时返回值不准】
    if(e->button() == Qt::MidButton)   //如果鼠标按下的键是中键
        {
            qDebug()<<"按下了鼠标中键";
            this->releaseMouse();   ///释放捕获的鼠标
        }
    qDebug()<<b;
    i++;
}

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>
#include "mybutton.h"

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

    void mousePressEvent(QMouseEvent *e);

private:
    MyButton* button;

};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{
    this->resize(200,200);
    button=new MyButton();
    button->setParent(this);
    button->setText("AAA");
    button->move(10,10);
    button->resize(100,100);
    button->grabMouse(); //指定控件捕获鼠标
    /*使按钮 AAA 捕获鼠标,此时产生的鼠标事件都只会发送给按钮 AAA,也就是说
    其他部件无法获得鼠标事件。
    只有可见的部件才能捕获鼠标输入,若 isVisible()返回 false,则该部件不能调用 grabMouse()函数
    void grabMouse(const QCursor &cursor) //捕获鼠标输入,并改变光标的形状
*/

}

Win::~Win()
{
}

void Win::mousePressEvent(QMouseEvent *e)
{
    bool b=button->underMouse();
    qDebug()<<"win鼠标事件"<<b;
}

main.cpp

#include "win.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Win w;
    w.show();
    return a.exec();
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt QChart是Qt提供的用于图表绘制的模块之一,通过QChart可以方便地创建各种类型的图表。在QChart中,可以通过处理鼠标事件来实现与用户的交互。 QChart中的鼠标事件主要包括三种:鼠标按下、鼠标移动和鼠标释放。可以通过在QChartView的事件过滤器中重写这些事件的处理函数来实现对鼠标事件的响应。 首先,需要在QChartView对象上启用鼠标追踪功能,这样在鼠标移动事件发生时才能捕捉到鼠标的当前位置。可以通过调用setMouseTracking(true)函数来实现。 在鼠标按下事件中,可以获取鼠标的当前位置,然后通过调用chart()->mapToValue()函数将屏幕坐标映射为图表坐标,从而确定鼠标点击的位置。接着,可以根据此位置进行相应的处理,例如高亮显示特定数据点或弹出数据提示框等。 在鼠标移动事件中,同样可以通过chart()->mapToValue()函数获取鼠标当前位置对应的图表坐标,然后可以根据当前位置的变化来动态更新图表中的一些元素,比如显示当前坐标的数值等。 在鼠标释放事件中,可以进行一些清理工作,例如恢复图表的初始状态,取消数据点的高亮显示等。 总的来说,通过处理QChartView中的鼠标事件,可以实现对QChart图表的交互操作,为用户提供更加丰富的数据展示和操作方式。 ### 回答2: Qt QChart是Qt框架中的一个图表库,用于绘制各种类型的图表。在QChart中,可以通过鼠标事件来与图表进行交互和操作。 首先,在QChart中,可以通过重写QWidget的鼠标事件相关的函数来处理鼠标事件。常用的鼠标事件函数有鼠标按下事件(mousePressEvent)、鼠标移动事件(mouseMoveEvent)、鼠标释放事件(mouseReleaseEvent)等。 鼠标按下事件(mousePressEvent)在用户按下鼠标按钮时触发,并通过获取鼠标坐标等信息来响应用户的操作。在QChart中,可以通过获取鼠标坐标,并利用坐标信息实现一些与鼠标操作相关的功能,例如在图表上显示数据点的数值。 鼠标移动事件(mouseMoveEvent)在用户移动鼠标时触发,可以通过获取鼠标坐标等信息进行一些动态效果的实现。例如,在移动鼠标时,在图表上显示鼠标所在位置的数据点信息。 鼠标释放事件(mouseReleaseEvent)在用户释放鼠标按钮时触发,可以用于完成一些鼠标操作的结束动作。例如,绘制一个矩形框选取图表上的一部分数据点。 通过使用这些鼠标事件函数,可以实现一些与用户交互和操作相关的功能。例如,通过判断鼠标的点击位置,在图表上绘制一个十字线,用于显示当前鼠标所在位置的数据点;或者通过鼠标拖拽某个数据点,实现数据的动态更新和交互。 总之,Qt QChart提供了丰富的鼠标事件函数,可以通过重写这些函数来响应用户的鼠标操作,实现与图表相关的交互和操作功能。 ### 回答3: Qt QChart提供了一些鼠标事件来处理用户与图表的交互。以下是一些常见的鼠标事件及其作用: 1. 鼠标进入事件(QEvent::Enter):当鼠标进入图表区域时触发,可以用于显示鼠标所在位置的数值或增加交互效果。 2. 鼠标移动事件(QEvent::MouseMove):当鼠标在图表区域内移动时触发,可以使用cursor().pos()函数获取当前鼠标的位置,以便在相应的坐标轴上显示数值或进行其他操作。 3. 鼠标滚轮事件(QEvent::Wheel):当鼠标滚轮在图表区域内滚动时触发,可以使用event->delta()函数获取滚轮的滚动方向和滚动距离,再根据需要进行图表的缩放或滚动。 4. 鼠标按下事件(QEvent::MouseButtonPress):当鼠标按下时触发,可以使用event->button()函数获取按下的鼠标按钮的类型(键、右键、中键等),再根据需要进行相应的操作,比如拖拽图表。 5. 鼠标释放事件(QEvent::MouseButtonRelease):当鼠标释放时触发,一般与鼠标按下事件结合使用,用于完成一些与鼠标操作相关的任务。 通过对这些鼠标事件的处理,可以实现一些高级的交互功能,如放大缩小、平移、数据查询等,从而提升用户体验和操作的灵活性。因此,在使用Qt QChart绘制图表时,合理处理这些鼠标事件是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值