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("GetMouse Event"));
        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 )//鼠标移动事件响应
{       
    //获取鼠标位置

    QString pStr("%1,%2");
    pStr = pStr.arg(e->pos().x()).arg(e->pos().y());
    statusBar()->showMessage (tr("Mouse Move:")+pStr);
}


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);//显示临时信息
    }
    elseif(e->button()==Qt::RightButton){
                                statusBar()->showMessage(tr("Mouse Right Button Pressed:")+str);
                    }
                    elseif(e->button()==Qt::MidButton){
                                            statusBar()->showMessage (tr("Mouse Middle ButtonPressed:")+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 ButtonDouble Clicked:")+str);
                    }
                else if(e->button()==Qt::RightButton){
                                            statusBar()->showMessage (tr("Mouse Right ButtonDouble Clicked:")+str);
                                }
                            else if(e->button()==Qt::MidButton){
                                                        statusBar()->showMessage (tr("Mouse Middle ButtonDouble Clicked:")+str);
                                            }
}


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


-------------//    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:
                    voidmouseMoveEvent ( QMouseEvent * e );
                    voidmousePressEvent ( QMouseEvent * e );
                    voidmouseReleaseEvent ( QMouseEvent * e );
                    voidmouseDoubleClickEvent( QMouseEvent * e );
};


#endif


//main.cpp


#include
<QtGui/QApplication>
#include "mouseevent.h"
int main(int argc, char *argv[])
{
        QApplicationapp(argc, argv);
        MouseEventw;w.show();
        returnapp.exec();
}

你可能感兴趣的:(Qt鼠标事件)