几乎现在见到的桌面应用都用到了鼠标,少了鼠标的应用,操作起来会异常的麻烦。那么在Qt中怎么引入鼠标操作呢。在桌面上按下鼠标或者是移动鼠标的指针时,都会产生对应的鼠标事件。鼠标的组成除了鼠标之外还有滚轮,同时滚轮的滚动也有自己的事件。在Qt中QMouseEvent类用来产生鼠标事件。利用这个事件可以判断时哪个键按下了以及指针的当前位置。QWheelEvent类用来表示鼠标滚轮事件,主要控制的时滚轮的滚定方向和距离。
接下来主要是两种类的使用,新建Qt Widgets应用,项目名称为mynmoouseevent,基类选择QWidget保持类名不变,在设计模式始终拖入TextEdit。然后在widget.h文件中进行protected函数声明
protected: void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event);
然后在private中添加一个变量用来储存指针位置与窗口位置的差距。
QPoint offset;
最后添加头文件
#include <QMouseEvent>
形成的widget.cpp是这样的:
#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(); // 获取指针位置和窗口位置的差值 } 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){ // 这里必须使用buttons() QPoint temp; temp = event->globalPos() - offset; move(temp);// 使用鼠标指针当前的位置减去差值,就得到了窗口应该移动的位置 }}void Widget::mouseReleaseEvent(QMouseEvent *event) // 鼠标释放事件{ Q_UNUSED(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(); // 进行缩小 }}
在滚轮事件的处理函数中,使用QWheelEvent类的delta()函数获取了滚轮的移动距离,每当滚轮移动一下,默认15°,而delta函数的返回值事15X8即整数120。向上滚动鼠标返回正值,向下返回负值。而在这里需要说明一下,鼠标的移动事件默认是在鼠标按下才启动的,如果想不按下就获得就要在构造函数后添加一行代码:set Mouse Tracking(true)
联系客服