Qt之鼠标事件

  widget.h如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
    class Widget;
}

class Widget : public QWidget {
    Q_OBJECT
public:
    explicit Widget ( QWidget *parent = 0 );
    ~Widget();
protected:
    void mousePressEvent ( QMouseEvent *event );
    void mouseReleaseEvent ( QMouseEvent *event );
    void mouseDoubleClickEvent ( QMouseEvent *event );
    void mouseMoveEvent ( QMouseEvent *event );
    void wheelEvent ( QWheelEvent *event );
private:
    Ui::Widget *ui;
    QPoint offset; /* 用来储存鼠标指针位置与窗口位置的差值 */
};

#endif // WIDGET_H

  widget.cpp如下:

#include "widget.h"
#include "ui_widget.h"
#include <QMouseEvent>

Widget::Widget ( QWidget *parent ) : QWidget ( parent ), ui ( new Ui::Widget ) {
    ui->setupUi ( this );
    // setMouseTracking ( true ); /* 设置鼠标跟踪 */
    QCursor cursor; /* 创建光标对象 */
    cursor.setShape ( Qt::OpenHandCursor ); /* 设置光标形状 */
    setCursor ( cursor ); /* 使用光标 */
}

Widget::~Widget() {
    delete ui;
}

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 ( "../yafeilinux.png" ) ); /* 使用自定义的图片作为鼠标指针 */
        QApplication::setOverrideCursor ( cursor );
    }
}

void Widget::mouseMoveEvent ( QMouseEvent *event ) { /* 鼠标移动事件 */
    if ( event->buttons() & Qt::LeftButton ) { /* 这里必须使用buttons */
        QPoint temp; /* 我们使用鼠标指针当前的位置减去差值,就得到了窗口应该移动的位置 */
        temp = event->globalPos() - offset;
        move ( temp );
    }
}

void Widget::mouseReleaseEvent ( QMouseEvent *event ) { /* 鼠标释放事件 */
    QApplication::restoreOverrideCursor(); /* 恢复鼠标指针形状 */
}

void Widget::mouseDoubleClickEvent ( QMouseEvent *event ) { /* 鼠标双击事件 */
    if ( event->button() == Qt::LeftButton ) { /* 如果是鼠标左键按下 */
        if ( windowState() != Qt::WindowFullScreen ) { /* 如果现在不是全屏,将窗口设置为全屏 */
            setWindowState ( Qt::WindowFullScreen );
        } else {
            setWindowState ( Qt::WindowNoState ); /* 如果现在已经是全屏状态,那么恢复以前的大小 */
        }
    }
}

void Widget::wheelEvent ( QWheelEvent *event ) { /* 滚轮事件 */
    /* 当滚轮远离使用者时进行放大,当滚轮向使用者方向旋转时进行缩小 */
    if ( event->delta() > 0 ) {
        ui->textEdit->zoomIn();
    } else {
        ui->textEdit->zoomOut();
    }
}

  使用globalPos函数来获取鼠标指针的位置,这个位置是指针在桌面上的位置。
  在滚轮事件处理函数中,使用QWheelEvent类的delta函数获取了滚轮移动的距离:

  1. 当滚轮向远离使用者的方向旋转时,返回正值。
  2. 当向着靠近使用者的方向旋转时,返回负值。
上一篇:Flutter生命周期


下一篇:3月4日