qt鼠标事件总结 (转)

1、QMouseEvent中的坐标
QMouseEvent中保存了两个坐标,一个是全局坐标,当然另外一个是局部坐标。
全局坐标(globalPos())即是桌面屏幕坐标(screencoordinates),这个跟windows下的调用getCursorPos函数得到的结果一致。
局部坐标(pos())即是相对当前active widget的坐标,左上角坐标为(0, 0)。

补充一个公式:
this->mapFromGlobal(this->cursor().pos()) = event.pos()



2、鼠标跟踪
在qt中,鼠标跟踪对应函数mouseMoveEvent。但是,默认情况下他并不能如期象你想象的那样响应鼠标的移动。此时,你只需在合适的位置调用一下函数setMouseTracking(true)即可。
If mouse tracking is switched off, mouse move events only occur ifa mouse button is pressed while the mouse is being moved.
If mouse tracking is switched on, mouse move events occur even ifno mouse button is pressed.
默认情况下,mouseMoveEvent响应你按下鼠标的某个键(拖动,但不局限于左键拖动)的鼠标移动。

3、鼠标左键拖动和左键点击的判断
鼠标左键点击很容易判断,一般就是在重写mousePressEvent函数,示例如下:
void XXXWidget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
// todo ...
}
}


左键拖动的判断一般放在mouseMoveEvent函数中,但是你不能向上例一样来判断,因为该函数的event参数总是返回Qt::NoButton。你可以这样做:
void XXXWidget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
// todo ...
}
}


参考教材实例,增加了注释和新功能,方便大家交流学习
// mouseevent.cpp
#include "mouseevent.h"
MouseEvent::MouseEvent( ):


QMainWindow()
{
setWindowTitle(tr("Get MouseEvent"));
setCursor(Qt::CrossCursor);//设置鼠标为十字星
labelStatus = new QLabel();
labelStatus->setMinimumSize(500,20);
labelStatus->setFrameShape(QFrame::WinPanel);//设置标签形状
labelStatus->setFrameShadow(QFrame::Sunken);//设置标签阴影;
labelStatus->setText(tr("MousePosition:"));
labelStatus -> setFixedWidth(100);
labelMousePos = new QLabel();
labelMousePos->setText(tr(""));
labelMousePos -> setFixedWidth(100);
statusBar()->addPermanentWidget(labelStatus);//给状态栏添加永久的部件
statusBar()->addPermanentWidget(labelMousePos);
this->setMouseTracking (true);//自动跟踪鼠标(默认情况下,mouseMoveEvent响应你按下鼠标的某个键的鼠标移动。)
}

MouseEvent::~MouseEvent(){


}


void MouseEvent::mouseMoveEvent ( QMouseEvent * e )//鼠标移动事件响应
{
//1.获取局部鼠标位置
labelMousePos->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");
//2.获取全局鼠标位置
QPoint coursePoint;
coursePoint =QCursor::pos();//获取当前光标的位置
labelMousePos->setText("("+QString::number(coursePoint.x())+","+QString::number(coursePoint.y())+")");
}


void MouseEvent::mousePressEvent ( QMouseEvent * e)//鼠标单击事件响应
{
QStringstr="("+QString::number(e->x())+","+QString::number(e->y())+")";
if(e->button()==Qt::LeftButton){
statusBar()->showMessage(tr("Mouse Left Button Pressed:")+str);//显示临时信息
}
else if(e->button()==Qt::RightButton){
statusBar()->showMessage(tr("Mouse Right Button Pressed:")+str);
}
elseif(e->button()==Qt::MidButton){
statusBar()->showMessage(tr("Mouse Middle Button Pressed:")+str);
}
}


void MouseEvent::mouseDoubleClickEvent( QMouseEvent * e)//鼠标双击事件响应
{ QStringstr="("+QString::number(e->x())+","+QString::number(e->y())+")";
if(e->button()==Qt::LeftButton){
statusBar()->showMessage(tr("Mouse Left Button Double Clicked:")+str);
}
elseif(e->button()==Qt::RightButton){
statusBar()->showMessage(tr("Mouse Right Button Double Clicked:")+str);
}
elseif(e->button()==Qt::MidButton){
statusBar()->showMessage(tr("Mouse Middle Button Double Clicked:")+str);
}
}


void MouseEvent::mouseReleaseEvent ( QMouseEvent * e)//鼠标松开事件响应
{
QStringstr="("+QString::number(e->x())+","+QString::number(e->y())+")";
statusBar()->showMessage(tr("Mouser Released:")+str,3000);
}



-------------// mouseevent.h
#ifndef MOUSEEVENT_H
#define MOUSEEVENT_H


#include
class MouseEvent : public QMainWindow
{Q_OBJECT
public:MouseEvent();
~MouseEvent();
private:
QLabel*labelStatus;
QLabel*labelMousePos;
protected :
voidmouseMoveEvent ( QMouseEvent * e );
voidmousePressEvent ( QMouseEvent * e );
voidmouseReleaseEvent ( QMouseEvent * e );
voidmouseDoubleClickEvent( QMouseEvent * e );
};


#endif



//main.cpp

#include

#include "mouseevent.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MouseEvent w;w.show();
return app.exec();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值