參考文獻:《Qt Creator 快速入門》第三版 霍亞飛編著
QMouseEvent類用來表示一個滑鼠事件,在視窗部件中按下滑鼠或者移動滑鼠指針時都會産生滑鼠事件。
QWheelEvent類用來表示滑鼠滾輪事件,主要用來擷取滾輪移動的放下和距離。
直接上栗子,實作功能:在界面上按着滑鼠左鍵拖動視窗,輕按兩下滑鼠左鍵全屏,按着滑鼠右鍵使之稱為一個自定義圖示,使用滾輪放大縮小編輯器的内容。
建立Qt Widgets應用,項目名為mymouseevent,基類選擇QWidget,類名儲存Widget不變。在設計模式下,拖入一個TextEdit,然後在widget.h中添加函數聲明如下。
protected:
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void mouseDoubleClickEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
再添加一個位置變量如下
private:
QPoint offset;
在widget.cpp函數中添加頭檔案#include <QMouseEvent >,并在構造函數中,添加以下代碼。
QCursor cursor;//建立光标對象
cursor.setShape(Qt::OpenHandCursor);//設定光标形狀
setCursor(cursor);//使用光标
然後實作頭檔案中聲明的幾個事件處理函數如下
void Widget::mousePressEvent(QMouseEvent *event)//滑鼠按下事件
{
if(event->button()==Qt::LeftButton)//如果是滑鼠左鍵按下
{
QCursor cursor;
cursor.setShape(Qt::ClosedHandCursor);
QApplication::setOverrideCursor(cursor);//使滑鼠指針暫時改變形狀
offset=event->globalPos()-pos();//擷取指針位置和視窗位置的內插補點
}else if(event->button()==Qt::RightButton)//如果是滑鼠右鍵按下
{
QCursor cursor(QPixmap("../mymouseevent/logo.png"));
QApplication::setOverrideCursor(cursor);//使用自定義的圖示作為滑鼠指針
}
}
滑鼠按下事件,左鍵按改變指針形狀,并記下目前指針位置與視窗位置的內插補點。右鍵按下,指針顯示為自定義圖示。
void Widget::mouseMoveEvent(QMouseEvent *event)//滑鼠移動事件
{
if(event->buttons()&Qt::LeftButton)
{
QPoint temp;
temp=event->globalPos()-offset;
move(temp);//使用滑鼠目前的位置減去內插補點,就得到了視窗應該移動的位置
}
}
滑鼠移動處理事件。因為滑鼠移動時會檢測所有按下的鍵,是以這時候使用button()函數無法獲得哪個按鍵被按下,隻能使用Buttons函數與Qt::LeftButton安位與來判斷左鍵是否按下。
void Widget::mouseReleaseEvent(QMouseEvent *event)//滑鼠釋放事件
{
Q_UNUSED(event);
QApplication::restoreOverrideCursor();//恢複滑鼠指針形狀
}
滑鼠釋放事件函數,使用restoreOverrideCursor()函數恢複滑鼠指針形狀。
void Widget::mouseDoubleClickEvent(QMouseEvent *event)//滑鼠輕按兩下事件
{
if(event->button()==Qt::LeftButton)//如果是滑鼠左鍵按下
{
if(windowState()!=Qt::WindowFullScreen)//如果視窗不是全屏
setWindowState(Qt::WindowFullScreen);//将視窗設定位全屏
else
setWindowState(Qt::WindowNoState);//恢複視窗以前大小
}
}
滑鼠輕按兩下事件處理函數,使用setWindowState()函數處理視窗狀态。
void Widget::wheelEvent(QWheelEvent *event)//滾輪事件
{
if(event->delta()>0)//當滾輪遠離使用者時
ui->textEdit->zoomIn();//放大
else
ui->textEdit->zoomOut();//縮小
}
滾輪事件處理函數。當滾輪向遠離使用者旋轉時,傳回負值,當滾輪向靠近使用者旋轉時傳回正值。zoomIn和zoomOut函數實作放大縮小。
運作代碼檢視效果,如下圖分别是程式啟動後,單擊滑鼠左鍵,右擊滑鼠,移動視窗,放大縮小
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxCMNpXT0kEVPhXU6hFMG1mYw50MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0cDO2QjM1ITM1AzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)