常用操作
void Win::mousePressEvent(QMouseEvent *e) { if(e->button() == Qt::LeftButton) //如果鼠標按下的鍵是左鍵 //e->button() 返回鼠標當時按下的鍵--觸發事件的鍵 { qDebug()<<"按下了鼠標左鍵:"<<e->button(); } if(e->button() == Qt::RightButton) //如果鼠標按下的鍵是右鍵 { qDebug()<<"按下了鼠標右鍵"; } if(e->button() == Qt::MidButton) //如果鼠標按下的鍵是中鍵 { qDebug()<<"按下了鼠標中鍵"; } }
setMouseTracking(true); //設置鼠標跟蹤--不按住鼠標也能產生鼠標移動事件 //默認是當按下鼠標按鍵時移動鼠標,鼠標移動事件才會產生 //如果想不按鼠標按鍵,也可以獲得鼠標移動事件,可以構造函數上添加這一行 bool b=hasMouseTracking(); //返回鼠標跟蹤狀態 qDebug()<<b;
void Win::mouseMoveEvent(QMouseEvent *e) { static int i=0; QPoint point; point=e->pos(); //返回鼠標的坐標(相對於控件) QPoint(635,13) //每個Qwidget都能通過pos()獲取到相對自己父類窗口的位置 qDebug()<<"移動了鼠標:"<<i++<<" "<<point; int x=e->pos().x(); //返回鼠標的x坐標(相對於控件) int y=e->pos().y(); //返回鼠標的y坐標(相對於控件) x=e->x(); //返回鼠標的x坐標(相對於控件) y=e->y(); //返回鼠標的y坐標(相對於控件) QPointF pointF; pointF=e->localPos();//返回鼠標的坐標(相對於控件) //QPointF(635,13) QPoint point1; QPoint point2; point1=mapToGlobal(point); //將窗口坐標轉換成屏幕坐標 point2=mapFromGlobal(point1); //將相對於屏幕的坐標轉換成相對於窗口的坐標 point2=e->globalPos(); //返回鼠標相對於屏幕的坐標 /* mapToParent(QPoint) - 將窗口坐標轉換成父窗口坐標。如果沒有父窗口,則相當於mapToGlobal (QPoint) mapFromParent(QPoint) - 將父窗口坐標轉換成窗口坐標。如果沒有父窗口,則相當於mapFromGlobal(QPoint) mapTo (QWidget, QPoint) - 將窗口坐標轉換成 QWidget父窗口坐標 */ x=e->globalX(); //返回相對於屏幕的x坐標 y=e->globalY(); //返回相對於屏幕的y坐標 pointF=e->windowPos(); //返回相對於窗口的坐標 //QPointF(560,0) pointF=e->screenPos(); //相對於屏幕的坐標 //QPointF(1266,280) int t; t=e->timestamp(); //返回事件發生的時間。【以程序運行開始計時,以毫秒為單位】 qDebug()<<t; }
void Win::mouseDoubleClickEvent(QMouseEvent *e) { //方法返回雙擊的時間間隔 qDebug()<<"雙擊了鼠標"; /* 雙擊時的事件順序如下: MouseButtonPress MouseButtonRelease MouseButtonDblClick MouseButtonPress MouseButtonRelease setDoubleClickInterval( )方法可設置雙擊的時間間隔 doubleClickInterval( )方法返回雙擊的時間間隔 */ }
void Win::wheelEvent(QWheelEvent *e) { QPoint point=e->angleDelta(); //返回滾輪轉過的數值,單位為1/8度 //QPoint(0,120)--向上滾 QPoint(0,-120)--向下滾 point=point/8; //除以8之后單位為度 //QPoint(0,15) qDebug()<<point; }
ev->pixelDelta(); //返回屏幕上以像素為單位的滾動距離。此值是在支持基於高分辨率像素的delta值的平台(如macos)上提供的。該值應直接用於在屏幕上滾動內容
void Win::mousePressEvent(QMouseEvent *e) { static int i=0; qDebug()<<e->button(); //e->button() 只返回一個鍵--觸發事件的鍵 qDebug()<<e->buttons(); //e->buttons() 返回的是鼠標的按鍵情況--返回哪些鍵被按下 //QFlags<Qt::MouseButton>(LeftButton|RightButton) if(e->buttons() & Qt::LeftButton){ //如果按住了左鍵 //e->buttons() & Qt::LeftButton 返回左鍵是否被按住 qDebug()<<"你按下了左鍵:"<<i; } if(e->buttons() & Qt::LeftButton && e->buttons() & Qt::RightButton ){ //如果按住了左鍵和右鍵 qDebug()<<"你按下了左鍵和右鍵:"<<i; } if(e->buttons() & Qt::LeftButton && e->buttons() & Qt::MidButton ){ //如果按住了左鍵和中鍵 qDebug()<<"你按下了左鍵和中鍵:"<<i; } i++; }
鼠標事件的來源
Qt::MouseEventSource source() const;
返回鼠標事件的來源信息。鼠標事件除了可以來自於物理鼠標之外,還可以來自於其
他來源,比如觸摸屏的仿真鼠標事件。鼠標事件的來源使用枚舉Qt::MouseEventSource
來描述,該枚舉可取以下值

捕獲鼠標
mybutton.h
#ifndef MYBUTTON_H #define MYBUTTON_H #include <QPushButton> #include <QDebug> #include <QMouseEvent> class MyButton : public QPushButton { public: MyButton(); void mousePressEvent(QMouseEvent *e); }; #endif // MYBUTTON_H
mybutton.cpp
#include "mybutton.h" MyButton::MyButton() { } void MyButton::mousePressEvent(QMouseEvent *e) { static int i=0; qDebug()<<"button鼠標事件:"<<i; QWidget* ww= mouseGrabber(); //返回正在捕獲鼠標輸入的部件,若沒有則返回 0 //QPushButton(0x2f2f210) qDebug()<<"正在捕獲的控件:"<<ww; bool b= this->underMouse(); //若部件位於鼠標光標之下,則返回 true,否則返回 false //【這個函數:在鼠標被捕獲時返回值不准】 if(e->button() == Qt::MidButton) //如果鼠標按下的鍵是中鍵 { qDebug()<<"按下了鼠標中鍵"; this->releaseMouse(); ///釋放捕獲的鼠標 } qDebug()<<b; i++; }
win.h
#ifndef WIN_H #define WIN_H #include <QWidget> #include <QDebug> #include "mybutton.h" class Win : public QWidget { Q_OBJECT public: Win(QWidget *parent = nullptr); ~Win(); void mousePressEvent(QMouseEvent *e); private: MyButton* button; }; #endif // WIN_H
win.cpp
#include "win.h" Win::Win(QWidget *parent) : QWidget(parent) { this->resize(200,200); button=new MyButton(); button->setParent(this); button->setText("AAA"); button->move(10,10); button->resize(100,100); button->grabMouse(); //指定控件捕獲鼠標 /*使按鈕 AAA 捕獲鼠標,此時產生的鼠標事件都只會發送給按鈕 AAA,也就是說 其他部件無法獲得鼠標事件。 只有可見的部件才能捕獲鼠標輸入,若 isVisible()返回 false,則該部件不能調用 grabMouse()函數 void grabMouse(const QCursor &cursor) //捕獲鼠標輸入,並改變光標的形狀 */ } Win::~Win() { } void Win::mousePressEvent(QMouseEvent *e) { bool b=button->underMouse(); qDebug()<<"win鼠標事件"<<b; }
main.cpp
#include "win.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Win w; w.show(); return a.exec(); }
上面工程下載地址:鏈接:https://pan.baidu.com/s/1fhKizwvce49ZPtRykbSz7A 提取碼:6666