1. 介绍
QMouseEvent类用来表示一个鼠标事件,当在窗口部件中按下鼠标或者移动鼠标指针时,都会产生鼠标事件。利用QMouseEvent类可以获知鼠标是哪个键按下了,还有鼠标指针的当前位置等信息。通常是重定义部件的鼠标事件处理函数来进行一些自定义的操作。
QWheelEvent类用来表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向和距离。
2. 实例
//widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QPointF offset; //用来储存鼠标指针位置与窗口位置的差值protected:void mousePressEvent(QMouseEvent *event) override; //一些重新实现的事件处理函数void mouseReleaseEvent(QMouseEvent *event) override;void mouseDoubleClickEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void wheelEvent(QWheelEvent *event) override;};#endif // WIDGET_H
//widget.cpp
#include <QDebug>
#include "widget.h"
#include "ui_widget.h"
#include <QMouseEvent>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);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(); // 获取指针位置和窗口位置的差值qDebug() << "鼠标左键按下事件";}else if(event->button() == Qt::RightButton){ // 如果是鼠标右键按下QCursor cursor(QPixmap("../mymouseevent/logo.png"));QApplication::setOverrideCursor(cursor);// 使用自定义的图片作为鼠标指针qDebug() << "鼠标右键按下事件";}
}void Widget::mouseMoveEvent(QMouseEvent *event) // 鼠标移动事件
{if(event->buttons() & Qt::LeftButton){ // 这里必须使用buttons()QPointF temp;temp = event->globalPos() - offset;move(temp.x(), temp.y());// 使用鼠标指针当前的位置减去差值,就得到了窗口应该移动的位置qDebug() << "鼠标移动事件";}
}void Widget::mouseReleaseEvent(QMouseEvent *event) // 鼠标释放事件
{Q_UNUSED(event);QApplication::restoreOverrideCursor(); // 恢复鼠标指针形状qDebug() << "鼠标释放事件";
}void Widget::mouseDoubleClickEvent(QMouseEvent *event) // 鼠标双击事件
{if(event->button() == Qt::LeftButton){ // 如果是鼠标左键按下if(windowState() != Qt::WindowFullScreen) // 如果现在不是全屏setWindowState(Qt::WindowFullScreen); // 将窗口设置为全屏else setWindowState(Qt::WindowNoState); // 否则恢复以前的大小qDebug() << "鼠标双击事件";}
}void Widget::wheelEvent(QWheelEvent *event) // 滚轮事件
{if(event->angleDelta().y() > 0){ // 当滚轮远离使用者时ui->textEdit->zoomIn(); // 进行放大}else{ // 当滚轮向使用者方向旋转时ui->textEdit->zoomOut(); // 进行缩小}qDebug() << "鼠标滚轮事件";
}
部分测试结果:
CentOS 7 64 位 - VMware Workstation 2024-02-22 14-02-54