from http://blog.csdn.net/whealker/archive/2011/01/17/6146109.aspx
by whealker
参考教材实例,增加了注释和新功能,方便大家交流学习
//mouseevent.cpp
#include "mouseevent.h" MouseEvent::MouseEvent( ) : QMainWindow() { setWindowTitle(tr("Get Mouse Event")); setCursor(Qt::CrossCursor);//设置鼠标为十字星 labelStatus = new QLabel(); labelStatus->setMinimumSize(500,20); labelStatus->setFrameShape(QFrame::WinPanel);//设置标签形状 labelStatus->setFrameShadow(QFrame::Sunken); //设置标签阴影; labelStatus->setText(tr("Mouse Position:")); 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 )//鼠标单击事件响应 { QString str="("+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); } else if(e->button()==Qt::MidButton) { statusBar()->showMessage (tr("Mouse Middle Button Pressed:")+str); } } void MouseEvent::mouseDoubleClickEvent( QMouseEvent * e )//鼠标双击事件响应 { QString str="("+QString::number(e->x())+","+QString::number(e->y())+")"; if(e->button()==Qt::LeftButton) { statusBar()->showMessage (tr("Mouse Left Button Double Clicked:")+str); } else if(e->button()==Qt::RightButton) { statusBar()->showMessage (tr("Mouse Right Button Double Clicked:")+str); } else if(e->button()==Qt::MidButton) { statusBar()->showMessage (tr("Mouse Middle Button Double Clicked:")+str); } } void MouseEvent::mouseReleaseEvent ( QMouseEvent * e )//鼠标松开事件响应 { QString str="("+QString::number(e->x())+","+QString::number(e->y())+")"; statusBar()->showMessage (tr("Mouser Released:")+str,3000); } /* statusBar()状态栏 状态栏位于主窗口的最下方,提供一个显示工具提示等信息的地方。 一般地,当窗口不是最大化的时候,状态栏的右下角会有一个可以调节大小的控制点; 当窗口最大化的时候,这个控制点会自动消失。Qt提供了一个QStatusBar类来实现状态栏。 QMainWindow类里面就有一个statusBar()函数,用于实现状态栏的调用。 类似menuBar()函数,如果不存在状态栏,该函数会自动创建一个,如果已经创建则会返回这个状态栏的指针。 如果你要替换掉已经存在的状态栏,需要使用QMainWindow的setStatusBar()函数。 状态栏显示的信息有三种类型:临时信息、一般信息和永久信息。 其中,临时信息指临时显示的信息,一段时间后自动消失——这个功能可以使用QStatusBar的showMessage()函数来实现; 一般信息可以用来显示页码之类的; 永久信息是不会消失的信息,比如可以在状态栏提示用户Caps Lock键被按下之类。 */ -------------------------------------------------------------------------- //mouseevent.h #ifndef MOUSEEVENT_H #define MOUSEEVENT_H #include <QtGui> class MouseEvent : public QMainWindow { Q_OBJECT public: MouseEvent(); ~MouseEvent(); private: QLabel *labelStatus; QLabel *labelMousePos; protected : void mouseMoveEvent ( QMouseEvent * e ); void mousePressEvent ( QMouseEvent * e ); void mouseReleaseEvent ( QMouseEvent * e ); void mouseDoubleClickEvent( QMouseEvent * e ); }; #endif -------------------------------------------------------------------------- //main.cpp #include <QtGui/QApplication> #include "mouseevent.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MouseEvent w; w.show(); return a.exec(); }-------------------------------------------------------------------------- //mouseEbent.pro QT += core guiTEMPLATE = app SOURCES += main.cpp/ mouseevent.cpp HEADERS += mouseevent.h