天天看點

我的QT Creator學習筆記(十四)——事件系統之滑鼠事件和滾輪事件

參考文獻:《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函數實作放大縮小。

運作代碼檢視效果,如下圖分别是程式啟動後,單擊滑鼠左鍵,右擊滑鼠,移動視窗,放大縮小

我的QT Creator學習筆記(十四)——事件系統之滑鼠事件和滾輪事件
我的QT Creator學習筆記(十四)——事件系統之滑鼠事件和滾輪事件
我的QT Creator學習筆記(十四)——事件系統之滑鼠事件和滾輪事件
我的QT Creator學習筆記(十四)——事件系統之滑鼠事件和滾輪事件
我的QT Creator學習筆記(十四)——事件系統之滑鼠事件和滾輪事件
我的QT Creator學習筆記(十四)——事件系統之滑鼠事件和滾輪事件

繼續閱讀