鼠标按下事件
鼠标按下时,会触发该事件,其对应的子类是QMouseEvent
对应的枚举:QEvent::MouseButtonPress
需要重写的函数是:
void mousePressEvent(QMouseEvent* ev);
鼠标释放事件
鼠标按下后再释放,会触发该事件,其对应的子类是QMouseEvent
对应的枚举:QEvent::MouseMove
需要重写的函数是:
void mouseReleaseEvent(QMouseEvent* ev);
鼠标移动事件
鼠标按下后再移动时就会触发该事件,其对应的子类是QMouseEvent
对应的枚举:QEvent::MouseButtonRelease
需要重写的函数是:
void mouseMoveEvent(QMouseEvent* ev);
如果需要鼠标只要一进入某个窗口或者控件上面,不按下鼠标,然后移动,就触发鼠标移动事件,
那么就要设置鼠标跟踪,那么就调用窗口或控件的setMouseTracking(true)方法;
这个属性默认是关闭的
常用方法
通常我们在重写这三个函数时会用到QMouseEvent类的方法有:
ev->button()//判断事件发生时处于按下的鼠标是左键还是右键还是滚轮
ev->buttons()//作用同上,鼠标移动时用这个方法,具体用法见下面代码
ev->pos()//获取事件发生时鼠标在父窗口里面的位置
ev->x()//获取事件发生时鼠标在父窗口里面的位置的x坐标
ev->y()//获取事件发生时鼠标在父窗口里面的位置的y坐标
ev->globalPos()//获取事件发生时鼠标在整个屏幕中的位置
ev->globalX()///获取事件发生时鼠标在整个屏幕中的位置的x坐标
ev->globalY()///获取事件发生时鼠标在整个屏幕中的位置的y坐标
举例:
class MyWidget:public QWidegt
{
Q_OBJECT
public:
explicit MyWidget(QWidget* parent):QWidget{parent}
{
//设置鼠标追踪,鼠标悬浮在窗口上面移动,不用按下按键也能触发鼠标移动事件了
//this->setMouseTracking(true);
}
protected:
void mousePressEvent(QMouseEvent* ev)
{
//鼠标按下时打印:按下了鼠标的哪个键:左键还是右键还是滚轮;
//按下的相对于父窗口的位置
//按下的全屏位置
qDebug<<"鼠标按下:"<<ev->button()<<ev->pos()<<ev<<globalPos();
//如果按下了左键
if(ev->button()==Qt::LeftButton)
{
//做一些逻辑处理
//这里打印下按下的相对于父窗口的位置的x和y
qDebug()<<"按下了左键:x="<<ev->x()<<" y="<<ev->y();
}
//else if()
//{
//按下其他键,做的操作.....
//}
}
void mouseReleaseEvent(QMouseEvent* ev)
{
//鼠标释放时打印:释放了鼠标的哪个键:左键还是右键还是滚轮;
//鼠标释放的相对于父窗口的位置
//鼠标释放的全屏位置
qDebug<<"鼠标释放:"<<ev->button()<<ev->pos()<<ev<<globalPos();
//如果释放时释放的是右键
if(ev->button()==Qt::RightButton)
{
//做一些逻辑处理
//这里打印下鼠标释放的时候相对于父窗口的位置的x和y
qDebug()<<"释放了右键:x="<<ev->x()<<" y="<<ev->y();
}
//else if()
//{
//按下其他键,做的操作.....
//}
}
void mouseMoveEvent(QMouseEvent* ev)
{
//鼠标移动时打印:鼠标移动过程中按下了鼠标的哪些键:左键还是右键还是滚轮;
//鼠标移动时的相对于父窗口的位置
//鼠标移动时的全屏位置
//鼠标移动时判断按键要使用buttons()方法才能获取到移动中按下的鼠标按键,
//button()方法获取不到
qDebug<<"鼠标移动中:"<<ev->buttons()<<ev->pos()<<ev<<globalPos();
//注意判断鼠标移动过程按下了什么键的写法
if(ev->buttons()==Qt::LeftButton)
{
qDebug()<<"鼠标移动中:按下了左键";
//这里打印下鼠标移动时的时候相对于父窗口的位置的x和y
qDebug()<<"鼠标移动中:x="<<ev->x()<<" y="<<ev->y();
}
else if(ev->buttons()==Qt::RightButton)
{
qDebug()<<"鼠标移动中:按下了右键";
}
else if(ev->buttons()==Qt::MiddleButton)
{
qDebug()<<"鼠标移动中:按下了滚轮";
}
else if(ev->buttons()==(Qt::RightButton|Qt::LeftButton))
{
qDebug()<<"鼠标移动中:按下了右键和左键";
}
else if(ev->buttons()==(Qt::RightButton|Qt::LeftButton|Qt::MiddleButton))
{
qDebug()<<"鼠标移动中:按下了左右键和滚轮";
}
else if(ev->buttons()==Qt::NoButton)
{
qDebug()<<"鼠标移动中:没有按下任何按键";
}
}
};