QT基础:event 函数重载、筛选鼠标按压事件、获取鼠标位置、右键显示菜单、修改鼠标样式功能演示

这里演示的是QT基础,主要包含:event 函数重载、筛选鼠标按压事件、获取鼠标位置、右键显示菜单、修改鼠标样式等功能演示,适合初学者食用

演示功能:点击鼠标左键、右键、中键、左右键同时点击,输出鼠标当前坐标;按下鼠标中键,鼠标样式被替换,按下鼠标左键,鼠标样式恢复默认 

鼠标事件重载,这里暂时不放出来了

1、打开QT创建一个 widget 项目

UI上随便画一点东西备用,不画也行,我这里创建的是 mainwindow 项目

 2、代码演示,篇幅原因就不放头文件了,这里的代码全部写在了cpp当中

初学者应该可以完全复制该代码,到自己的demo里面的,注意头文件需要声明一些东西

同时也可以尝试注释一些代码,演示的时候方面看效果

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>
#include <QMenu>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 开启鼠标追踪
    this->setMouseTracking(true);

    // 右键菜单 头文件中声明
    menu.addAction("复制");
    menu.addAction("粘贴");
    menu.addAction("撤销");
    menu.addAction("属性");
}

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

// 头文件中声明
bool MainWindow::event(QEvent * ev)
{
    // 筛选鼠标按钮被按压事件
    if(ev->type() == QEvent::MouseButtonPress)
    {
        // 创建鼠标事件的对象
        QMouseEvent * me = static_cast<QMouseEvent*>(ev);
        // 相对坐标
        qDebug() << "相对坐标:" << me->x() << "," << me->y();
        // 窗口坐标(针对于某一窗口或 widget)
        qDebug() << "程序坐标:" << me->windowPos().x() << "," << me->windowPos().y();
        // 屏幕坐标
        qDebug() << "屏幕坐标:" << me->screenPos().x() << "," << me->screenPos().y();

        // 本地坐标转全局坐标(屏幕坐标)
        QPoint gpos = mapToGlobal(me->pos());
        qDebug() << "本地坐标转屏幕坐标:" << gpos.x() << "," <<  gpos.y();

        // 获取鼠标位置 (屏幕位置)
        qDebug() << "鼠标位置:" << QCursor::pos().x() << "," << QCursor::pos().y();

        // 鼠标按键事件   单个触发用 button
        if(me->button() & Qt::LeftButton)
        {
            qDebug() << "鼠标左键被按下";
            // 鼠标样式恢复默认
            setCursor(Qt::ArrowCursor);
        }
        if(me->button() & Qt::RightButton)
        {
            // 显示菜单,在屏幕坐标位置
            menu.exec(gpos);
            qDebug() << "鼠标右键被按下";
        }
        if(me->button() & Qt::MidButton)
        {
            qDebug() << "鼠标中键被按下";
            QPixmap pix("C:/Users/patient/Pictures/Saved Pictures/小黄鸡IKUN篮球.jpg");
            // 替换鼠标样式,默认触发点在图片中心
            QCursor cur = QCursor(pix,-1,-1);
            setCursor(cur);
        }
        // 鼠标左右键同时按下    两个一起触发用 buttons
        if(me->buttons() & Qt::LeftButton && me->buttons() & Qt::RightButton)
            qDebug() << "鼠标左右键同时按下";    


    }

    return QWidget::event(ev);
}

3、演示效果

 4、注意事项

坐标的 0,0 位置一般是在窗口或者屏幕的左上角位置,坐标是可以为负数的(窗口坐标或程序坐标),这里动图演示的不完整,有兴趣的小伙伴可以自己尝试一下

相对坐标:指的是鼠标相对于整个窗口的位置,0,0 的位置是在窗口左上角

窗口坐标(程序坐标):指的是某 widget 的坐标,例如在QLabel中取窗口坐标,那么 0,0 的位置是在 QLabel 的左上角

屏幕坐标:就是指整个屏幕的坐标,0,0 的位置是在屏幕左上角

猜你喜欢

转载自blog.csdn.net/qq_39085747/article/details/129632555
今日推荐