Qt5鼠标事件

这篇具有很好参考价值的文章主要介绍了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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓文章来源地址https://www.toymoban.com/news/detail-659000.html

到了这里,关于Qt5鼠标事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT5 QCustomPlot实现动态曲线绘制,可以左键放大、右键拖拽、跟随鼠标显示坐标

    下载文件,官网:https://www.qcustomplot.com/ 按照官网教程,qt添加帮助文件。 git或github下载:XCustomPlot 打开项目,将1下载的文件解压,添加qcustomplot.cpp/p。 在pro文件中添加QT += widgets printsupport、添加CONFIG += c++11. 引入头文件 #include “qcustomplot.h” 在ui中添加Widgeet,提升为QCustomP

    2024年02月10日
    浏览(50)
  • Qt5鼠标事件

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

    2024年02月12日
    浏览(30)
  • 【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.4 鼠标按下、移动、释放事件

    本章要实现的整体效果如下: QEvent::MouseButtonPress ​ 鼠标按下时,触发该事件,它对应的子类是 QMouseEvent QEvent::MouseMove ​ 鼠标移动时,触发该事件,它对应的子类是 QMouseEvent QEvent::MouseButtonRelease ​ 鼠标释放时,触发该事件,它对应的子类是 QMouseEvent 本节通过两个案例来讲

    2024年02月08日
    浏览(49)
  • Qt 鼠标左键推拽界面

    代码实现: button 返回 哪个按钮造成了此事件, buttons 返回 发生此事件时哪些按钮还处于按下状态 appinitdrag.h appinitdrag.cpp 在 main.cpp 里添加 appinitdrag.h ,然后在要设定拖拽的 widget 窗口的构造函数里添加代码

    2024年02月04日
    浏览(46)
  • Qt 之按钮鼠标 悬浮、按下、松开后的效果

    本文介绍了Qt中的按钮实现响应鼠标悬浮、按下、松开后的效果,在三种状态下,按钮改变不同的背景图片。 方式1:通过修改样式表的方式去实现; 方式2:通过继承QPushButton去实现一个自定义的按钮; 方式3:在主界面中给按钮安装事件过滤器的方式去实现 这里尽量不要有

    2024年02月10日
    浏览(46)
  • QT基础篇(11)QT5事件处理及实例

    1.鼠标事件及实例 QT5中有多种鼠标事件可以使用,常用的鼠标事件有: mousePressEvent :当鼠标按下时触发的事件。 mouseReleaseEvent :当鼠标释放时触发的事件。 mouseDoubleClickEvent :当鼠标双击时触发的事件。 mouseMoveEvent :当鼠标移动时触发的事件。 wheelEvent :当鼠标滚轮滚动时

    2024年01月19日
    浏览(44)
  • Qt音视频开发37-识别鼠标按下像素坐标

    在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸,用户单击某个人脸后指定对该人脸进行详细的信息查询

    2023年04月16日
    浏览(47)
  • Qt/C++音视频开发37-识别鼠标按下像素坐标

    在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸,用户单击某个人脸后指定对该人脸进行详细的信息查询

    2024年02月11日
    浏览(48)
  • QT QToolButton在鼠标悬浮以及按下的情况下内容会下沉

    使用样式表可以解决此问题 使用此样式可以取消按下状态的下沉效果 如果鼠标悬浮出现下沉效果 我发现的其中一个原因是:按钮原始状态下无边框,而悬浮状态下有边框。 就可以将原始状态的边框颜色设置为透明,即可取消下沉效果 注意:边框的粗细要一致,因为原始状

    2024年02月12日
    浏览(48)
  • Windows平台鼠标按下标题栏的阻塞问题研究(使用Qt框架)

    以下内容是Windows平台特有问题,其他平台可以忽略。 一直以来使用Qt开发桌面程序,拖拽移动窗口时,偶尔会发现明显的“掉帧”,以为是机器性能或者Qt框架的机制引起的刷新异常便没有在意。最近在使用QTimer定时在QWidget上渲染视频时,才发现比想象的更严重。 经过测试

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包