日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QMouseEvent鼠标事件简介

發(fā)布時間:2024/9/21 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QMouseEvent鼠标事件简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、QMouseEvent的詳細描述

首先請注意,Qt中的QMouseEvent一般只涉及鼠標左鍵或右鍵的單擊、釋放等操作,而對鼠標滾輪的響應則通過QWheeEvent來處理。

QMouseEvent類包含了用于描述鼠標事件的參數(shù)。

當在一個窗口里按住鼠標按鍵、或移動、或釋放就會產(chǎn)生鼠標事件QMouseEvent。

鼠標移動事件只會在按下鼠標按鍵的情況下才會發(fā)生,除非通過顯式調(diào)用QWidget::setMouseTracking()函數(shù)來開啟鼠標軌跡,這種情況下只要鼠標指針在移動,就會產(chǎn)生一系列的QT鼠標事件;

在一個窗口中,當鼠標按鍵被按下時,QT會自動捕捉鼠標軌跡,鼠標指針所在的父窗口會繼續(xù)接受鼠標事件,直到最后一個鼠標按鍵被釋放。

二、QMouseEvent的傳遞

一個鼠標事件包含一些指定的接受標志flag用于指出該事件是否會被接收和處理 ,如果鼠標指針所在的父窗口不接收該事件則可以調(diào)用函數(shù)ignore()予以忽略;

多個重疊的窗口在實現(xiàn)里好比一個遞歸的倒立樹,鼠標事件會沿著鼠標指針所在的父窗口的鏈表向上傳遞,直到某個窗口調(diào)用accept()函數(shù)進行事件處理,否則該事件將被過濾銷毀掉;

如果一個鼠標事件傳遞給鼠標指針所在的窗口,而該窗口的QT::WA_NoMousePropagation位置為TRUE,則該事件不會通過父窗口繼續(xù)向上傳遞。

可以通過函數(shù)pos()、x()、y()得知鼠標事件發(fā)生時鼠標指針相對于窗口的位置。

如果把移動窗口作為一次鼠標事件,可以通過函數(shù)globalPos()返回的全局坐標值避免窗口的抖動。?

可以使用QWidget::setEndabled()來開啟/關閉對應的窗口是否接受鍵盤和鼠標事件。


需要對鼠標事件進行處理時,通常要重新實現(xiàn)以下幾個鼠標事件處理函數(shù):

QWidget::mousePressEvent() QWidget::mouseReleaseEvent() QWidget::mouseDoubleClickEvent() QWidget::mouseMoveEvent()

?三、鼠標事件

鼠標事件使用的時候,加頭文件

#include <QMouseEvent>

1.鼠標按下事件

void Widget::mousePressEvent(QMouseEvent *event) {// 如果是鼠標左鍵按下if(event->button() == Qt::LeftButton){···}// 如果是鼠標右鍵按下else if(event->button() == Qt::RightButton){···} }

2.鼠標移動事件 默認情況下,觸發(fā)事件需要點擊一下,才能觸發(fā)。可設置為自動觸發(fā):setMouseTracking(true);?

void Widget::mouseMoveEvent(QMouseEvent *event) {// 這里必須使用buttons()if(event->buttons() & Qt::LeftButton) //進行的按位與{ ···} }

3.鼠標釋放事件

void Widget::mouseReleaseEvent(QMouseEvent *event) {··· }

4.鼠標雙擊事件

void Widget::mouseDoubleClickEvent(QMouseEvent *event) {// 如果是鼠標左鍵按下if(event->button() == Qt::LeftButton){···} }

5.滾輪事件

void Widget::wheelEvent(QWheelEvent *event) {if(event->delta() > 0)// 當滾輪遠離使用者時{···}else//當滾輪向使用者方向旋轉時{···} }

四、鍵盤事件

鍵盤事件使用時,加頭文件

#include <QKeyEvent>

?

1.鍵盤按下事件

void Widget::keyPressEvent(QKeyEvent *event) {// 是否按下Ctrl鍵 特殊按鍵if(event->modifiers() == Qt::ControlModifier){// 是否按下M鍵 普通按鍵 類似if(event->key() == Qt::Key_M)···}else QWidget::keyPressEvent(event); //保存默認事件//如果是處理兩個普通按鍵,得避免自動重復,釋放中也要處理if(event->key() == Qt::Key_Up){// 按鍵重復時不做處理if(event->isAutoRepeat()) return;// 標記向上方向鍵已經(jīng)按下keyUp = true;}else if(event->key() == Qt::Key_Left){if(event->isAutoRepeat()) return;keyLeft = true;} }

?

2.按鍵釋放事件

void Widget::keyReleaseEvent(QKeyEvent *event) {···//如果是處理兩個普通按鍵,得避免自動重復if(event->key() == Qt::Key_Up){if(event->isAutoRepeat()) return;··· }else if(event->key() == Qt::Key_Left){if(event->isAutoRepeat()) return;···} }

?五、常用公有成員函數(shù)

1.globalPos()、globalX()、globalY()這三個函數(shù)返回的是鼠標指針的全局坐標。


?

const?QPoint?& QMouseEvent::globalPos ()?const
返回鼠標指針的全局坐標值,對于異步窗口系統(tǒng)例如X11這是一個很重要的特性,無論何時移動窗口作為對鼠標事件的響應時,globalPos()返回的當前鼠標指針坐標值和QCursor::pos()的返回值是有區(qū)別的,可以通過調(diào)用QWidget::mapToGlobal(pos())在窗口坐標和全局坐標系之間進行轉換。


?

int QMouseEvent::globalX ()?const
返回鼠標事件發(fā)生時鼠標指針全局坐標的X值,相當于globalPos.x();


?

int QMouseEvent::globalY ()?const
返回鼠標事件發(fā)生時鼠標指針全局坐標的Y值,相當于globalPos.y()。


?

?

?

2.pos()、posF()、x()、y()這四個函數(shù)返回的是鼠標指針在當前接收鼠標事件的窗口中的位置。


const QPoint & QMouseEvent::pos () const
返回鼠標指針和接受該鼠標事件窗口的相對位置,其中的坐標值為整型;


QPointF QMouseEvent::posF () const
返回鼠標指針在接受該鼠標事件窗口的相對位置,該坐標值用float類型表示可以增加精確度;


int QMouseEvent::x () const
返回鼠標事件發(fā)生時,鼠標指針在當前接收鼠標事件的窗口中位置的x坐標值,相當與pos().x();


int QMouseEvent::y () const
返回鼠標事件發(fā)生時,鼠標指針在當前接收鼠標事件的窗口中位置的y坐標值,相當于pos().y()。

總結

以上是生活随笔為你收集整理的QMouseEvent鼠标事件简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。