qt鼠标事件总结 (转)
来源:互联网 发布:淘宝详情页多大尺寸 编辑:程序博客网 时间:2024/06/05 02:44
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();
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();
}
http://blog.sina.com.cn/s/blog_a401a1ea0101ebzh.html
0 0
- qt鼠标事件总结(转)
- qt鼠标事件总结(转)
- qt鼠标事件总结 (转)
- qt鼠标事件总结(转)
- qt鼠标事件总结 (转)
- qt鼠标事件总结(转)
- qt鼠标事件总结
- Qt鼠标事件总结
- Qt鼠标事件总结
- QT鼠标事件总结
- qt鼠标事件总结
- qt鼠标事件总结
- qt鼠标事件总结
- Qt学习: 鼠标事件总结(转)
- qt鼠标事件总结(一)
- QT鼠标事件总结(二)示例
- QT鼠标事件的总结
- Qt鼠标事件QMouseEvent总结
- php高级程序员面试题
- miniui数据集显示时可以加载自定义字段内容
- Android UI开发第四十二篇——实现实现易信的圆形图像和对话列表的图像显示部分
- 摘要:阿里云聚无线联合高德、友盟、科大讯飞等,为开发者提供一站式服务。成为扶持认证开发者,就能享受三个月免费云资源。
- oracle数据库表死锁或者存储过程,包无法编辑解决方法
- qt鼠标事件总结 (转)
- cygwin下载、安装教程和解决CDT出现“program 'make' is not found in path”bug
- 马伊俐父亲:请放过我的孩子
- 关于插件编程
- win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法
- 白盒测试学习总结1
- java 单例模式的优化与扩展
- CVS 项目出现两个版本号
- SuSe linux SSH IDLE SESSION TimeOut configuration