常用操作
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()<<"按下了鼠标中键"; } }
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(); }
上面工程下载地址:链接:https://pan.baidu.com/s/1fhKizwvce49ZPtRykbSz7A 提取码:6666