我是靠谱客的博主 直率微笑,最近开发中收集的这篇文章主要介绍Qt - Qt5事件处理(鼠标事件),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

鼠标事件

​ 鼠标事件包括鼠标的移动,鼠标键按下,松开,单击,双击等

使用鼠标事件时,加入对应头文件

#include <QMouseEvent>

常见的鼠标事件如下:

  void mousePressEvent(QMouseEvent *e); //单击
 void mouseMoveEvent(QMouseEvent *e); //移动
 void mouseReleaseEvent(QMouseEvent *e); //释放
 void mouseDoubleClickEvent(QMouseEvent *e); //双击
  void wheelEvent(QWheelEvent *e); //滑轮滚动

QMouseEvent类包含了用于描述鼠标事件的参数。

当在一个窗口里按住鼠标按键、或移动、或释放就会产生鼠标事件QMouseEvent。

鼠标移动事件只会在按下鼠标按键的情况下才会发生,除非通过显式调用QWidget::setMouseTracking()函数来开启鼠标轨迹,这种情况下只要鼠标指针在移动,就会产生一系列的QT鼠标事件;

在一个窗口中,当鼠标按键被按下时,QT会自动捕捉鼠标轨迹,鼠标指针所在的父窗口会继续接受鼠标事件,直到最后一个鼠标按键被释放。

鼠标事件实例

​ 设置一个特定窗口,状态栏右侧会实时显示当前鼠标所在的位置信息

在这里插入图片描述

mainwindow.h头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QStatusBar>
#include <QMouseEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
    void mouseDoubleClickEvent(QMouseEvent *e);
    void wheelEvent(QWheelEvent *e);

private:
    Ui::MainWindow *ui;

    QLabel *statusLabel;
    QLabel *MousePosLabel;
};
#endif // MAINWINDOW_H

mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle(tr("鼠标事件"));
    statusLabel = new QLabel;
    statusLabel->setText(tr("当前位置:"));
    statusLabel->setFixedWidth(100);
    MousePosLabel = new QLabel;
    MousePosLabel->setText(tr(""));
    MousePosLabel->setFixedWidth(100);
    statusBar()->addPermanentWidget(statusLabel);
    statusBar()->addPermanentWidget(MousePosLabel);
    this->setMouseTracking(true);
    resize(400,400);
}

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

void MainWindow::mousePressEvent(QMouseEvent *e)
{
    QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
    if(e->button()==Qt::LeftButton)
        statusBar()->showMessage(tr("左键:")+str);
    else if(e->button()==Qt::RightButton)
        statusBar()->showMessage(tr("右键:")+str);
    else if(e->button()==Qt::MidButton)
        statusBar()->showMessage(tr("中键:")+str);
}

void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    MousePosLabel->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");
}

void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{
    QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
    statusBar()->showMessage(tr("释放在:")+str,3000);
}

void MainWindow::mouseDoubleClickEvent(QMouseEvent *e)
{
    QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
    statusBar()->showMessage(tr("双击在:")+str,3000);
}

void MainWindow::wheelEvent(QWheelEvent *e)
{
    if(e->delta()>0) {
        statusBar()->showMessage(tr("鼠标滑轮向外滚动"),5000);
    }
    else {
        statusBar()->showMessage(tr("鼠标滑轮向内滚动"),5000);
    }
}

注:

  1. this->setMouseTracking(true); 设置窗体跟踪鼠标。setMouseTracking()函数设置窗体是否追踪鼠标,默认为false,不追踪,在此情况下应至少有一个鼠标键被按下时才响应鼠标移动事件
  2. QMouseEvent类的button()方法 可以获得发生鼠标事件的按键属性(左键,右键,中键等)
  3. QMouseEevent类的x()和y()方法可以获得鼠标相对于接收事件的窗体位置,globalX()和globalY()方法可以获得鼠标相对窗口系统的位置

最后

以上就是直率微笑为你收集整理的Qt - Qt5事件处理(鼠标事件)的全部内容,希望文章能够帮你解决Qt - Qt5事件处理(鼠标事件)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部