Qt 基础组件速学 鼠标和键盘事件

news2024/11/18 17:39:06

学习目标: 鼠标事件和键盘事件应用

前置环境

运行环境:qt creator 4.12

学习内容和效果演示:

1.鼠标事件

根据鼠标的坐标位置,做出对应的事件。

2.键盘事件

根据键盘的输入做出对应操作

详细主要代码

1.鼠标事件

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    status = new QLabel("鼠标在当前窗口坐标为:");
    status->setFixedWidth(200);

    mouser = new QLabel("");
    mouser->setFixedWidth(200);


    statusBar()->addPermanentWidget(status);
    statusBar()->addPermanentWidget(mouser);

    this->setMouseTracking(true);
    resize(800,600);

    QImage *image=new QImage();
    if(!image->load("C:/Users/jbj/Pictures/test/IMG_5037.JPG")){
        QMessageBox::information(this,"失败","加载图片失败,请重新检查?");
        delete  image;
        return;
    }
    QLabel* imglabe = new QLabel(this);
    imglabe->setFixedSize(200,300);
    imglabe->setPixmap(QPixmap::fromImage(*image));
}

MainWindow::~MainWindow()
{
}

//鼠标移动时被调用
void MainWindow::mouseMoveEvent(QMouseEvent *e){
    mouser->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");
}
//鼠标按下时被调用
void MainWindow::mousePressEvent(QMouseEvent *e){
    QString qstr="("+QString::number(e->x())+","+QString::number(e->y())+")";
    if(e->button()==Qt::LeftButton)
    {
        statusBar()->showMessage("用户已按下鼠标[左键]坐标"+qstr);
    }
    else if(e->button()==Qt::RightButton)
    {
        statusBar()->showMessage("用户已按下鼠标[右键]坐标"+qstr);
    }
    else if(e->button()==Qt::MidButton)
    {
        statusBar()->showMessage("用户已按下鼠标[中键]坐标"+qstr);
    }
}
//鼠标释放时被调用
void MainWindow::mouseReleaseEvent(QMouseEvent *e){
    QString qstr="("+QString::number(e->x())+","+QString::number(e->y())+")";
    statusBar()->showMessage("用户已释放鼠标坐标"+qstr,20);
}

 2.键盘事件

这里用到了绘画的知识点

画板 Qpalette    画家 Qpainter  钢笔QPen

理解:画师在画板上做画,会用到钢笔,当要展现时,QPainter 负责将画板呈现。

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("键盘测试");
    setAutoFillBackground(true);
    //调色板
    QPalette pale =this->palette();
    pale.setColor(QPalette::Window,Qt::white);
    setPalette(pale);

    setMinimumSize(800,600);
    setMaximumSize(800,600);

    width=size().width();
    height=size().height();

    pix=new QPixmap(width,height);//画板
    pix->fill(Qt::white);

    //实际物体
    main=new QPixmap(28,28);
    main->fill(Qt::red);



    sx=30;
    sy=30;
    step=30;

    Drawpinit();



    resize(800,600);
}
void Widget::Drawpinit(){
    pix->fill(Qt::white); // 清空

    QPainter* painter =new QPainter;//画家
    QPen pen(Qt::DashDotLine);

    for (int i=step; i<width;i+=step) { //竖线
        painter->begin(pix); //选择画板
        painter->setPen(pen);
        painter->drawLine(QPoint(i,0),QPoint(i,height));
        painter->end();
    }
    for(int j=step;j<height;j=j+step) // 横线
    {
        painter->begin(pix);     //选择画板
        painter->setPen(pen);
        painter->drawLine(QPoint(0,j),QPoint(width,j));
        painter->end();
    }

    painter->begin(pix);
    painter->drawPixmap(QPoint(sx,sy),*main);
    painter->end();
}


void Widget::paintEvent(QPaintEvent *){
    QPainter painter;
    painter.begin(this);
    //将之前在 Drawpinit() 函数中绘制的 QPixmap 对象绘制到 Widget 的左上角(坐标 (0, 0))。
    painter.drawPixmap(QPoint(0,0),*pix);
    painter.end();

}
void Widget::keyPressEvent(QKeyEvent *evt){
    sx=sx-sx%step;
    sy=sy-sy%step;


    //左右移动
    if(evt->key()==Qt::Key_Left)
    {
        sx=(sx-step<0)?sx:sx-step;
    }
    if(evt->key()==Qt::Key_Right)
    {
        sx=(sx+step+main->width() > width)?sx:sx+step;
    }
    if(evt->key()==Qt::Key_Up)
    {
        sy=(sy-step<0)?sy:sy-step;
    }
    if(evt->key()==Qt::Key_Down)
    {
        sy=(sy+step+main->height() >height)?sy:sy+step;
    }
    Drawpinit(); //重新设置参数
    update();   //触发绘画
}
Widget::~Widget()
{

}

总结:

键盘事件:

        void keyPressEvent(QKeyEvent *evt) //按下时被调用

鼠标事件:

           //鼠标移动时被调用
            void mouseMoveEvent(QMouseEvent *e);
            //鼠标按下时被调用
            void mousePressEvent(QMouseEvent *e);
            //鼠标释放时被调用
            void mouseReleaseEvent(QMouseEvent *e);

详细开发则需查阅官方开发文档。

最后附上源代码链接
对您有帮助的话,帮忙点个star

26-mouserEvent · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

27-QkeyEvent · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#商铺出租数据#2024年6月北上广深成渝对比情况

#商铺出租数据#2024年6月北上广深成渝对比情况&#xff1a; 根据某8平台不完全样本统计&#xff0c;北上广深成渝商铺每平米月租金从高到低依次为 北京218.7元、上海212.1元、深圳159.3元、广州145.8元、成都138.6元、重庆104.1元。 地区 区县 日期 类型 数值 上海 全城 202…

开发必备基础知识【字符编码合集】

开发必备基础知识【字符编码合集】 大家在日常开发交流中会发现&#xff0c;别人那里运行的好好的文件&#xff0c;在你电脑上却无法编译&#xff0c;甚至出现一堆莫名其妙的字符&#xff0c;比如&#xff1a;&#xfffd;&#xfffd;&#xfffd; 程序中经常遇到一些关于乱码…

开发笔记:vue3+ts+vant 卡片数据分页,下拉加载,卡片左滑可删除

效果&#xff1a; 实现 使用vantui组件 van-swipe-cell van-card &#xff08;商品卡片&#xff09; 核心代码 const currentPage ref(1) const pageSize ref(4) const totalSize ref(10) const loading ref(false) const finished ref(false) const refreshing ref(…

商务办公优选!AOC Q27E3S2商用显示器,打造卓越新体验!

摘要&#xff1a;助办公室一族纵横职场&#xff0c;实现高效舒适办公&#xff01; 在日常商务办公中&#xff0c;对于办公室一族来说总有太多“难难难难难点”&#xff1a;工作任务繁琐&#xff0c;熬夜加班心力交瘁、长时间伏案工作导致颈椎、眼睛等出现问题&#xff0c;职业…

SQL Server 2022数据库对象

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 数据库对象是数据库的组成部分&#xff0c;数据表、视图、索引、存储过程以及触发器等都是数据库对象。 &#xff08;1&#xff09;数据库的主要对象是数据表&#xff0c;数据表是一…

基于LabVIEW的设备安装螺栓连接设计

介绍了一种基于LabVIEW的辅助设备安装螺栓连接设计案例。通过LabVIEW软件&#xff0c;实现了从螺栓规格预估、强度校核到物料选用的整个流程的软件化&#xff0c;提高了设计效率和安装可靠性。 项目背景 在轨道车辆设备安装中&#xff0c;螺栓连接作为一种常见的紧固方式&…

MSPM0G3507——读取引脚的高低电平方法(数字信号循迹模块)

SYSCFG配置 代码部分 //第一个传感器if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT_PIN1_PIN )xunji_PORT_PIN1_PIN) //黑&#xff0c;不亮 高{a1;}if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT…

C++开发调试工具:GDB调试,windebug调试,adb调试

我们在C开发过程中时常避免不了要调试追踪&#xff0c;一下介绍最主流的三种调试工具&#xff1a; 一.GDB调试 1.coredump文件&#xff1a; coredump文件是程序异常时系统产生的错误日志文件&#xff0c;即核心转储文件&#xff1b; 编译一个debug程序&#xff0c;必须是debu…

Appium元素定位(全网详细讲解)(二)

1.appium inspector&#xff08;定位元素的工具&#xff09;使用方法 详细介绍&#xff1a; 详细解释&#xff1a; 图标名称说明1Show Element Handles是否显示元素句柄2Select Elements选择元素定位3Tap/Swipe By Coordinates按坐标点击/滑动4Download Screenshot下载屏幕截…

Nginx-http_auth_basic_module使用

文章目录 前言一、ngx_http_auth_basic_module二、指令1.auth_basic1.auth_basic_user_file 示例生成密码文件配置basic认证浏览器验证 总结 前言 nginx可以通过HTTP Basic Authutication协议进行用户名和密码的认证。 一、ngx_http_auth_basic_module 生效阶段&#xff1a; …

科普文:如何进行有效沟通

概叙 你会沟通吗&#xff1f; 你知道正确的沟通应该怎么做吗&#xff1f; 在日常生活和工作中&#xff0c;不会沟通带来的困扰是否让你感同身受&#xff1f; 在工作中&#xff0c;你是否因表达不清让观点无法被同事理解和采纳&#xff0c;影响职业发展&#xff1f; 与上级交流是…

GuLi商城-商品服务-API-品牌管理-云存储开通与使用

这里学习下阿里云对象存储 地址&#xff1a;对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 登录支付宝账号&#xff0c;找到了我以前开通的阿里云对象存储 熟悉下API 文档中心 简介_对象存储(OSS)-阿里云帮助中心 我们将用这种方式上传阿里云OSS

C++怎么解决不支持字符串枚举?

首先&#xff0c;有两种方法&#xff1a;使用命名空间和字符串常量与使用 enum class 和辅助函数。 表格直观展示 特性使用命名空间和字符串常量使用 enum class 和辅助函数类型安全性低 - 编译器无法检查字符串有效性&#xff0c;运行时发现错误高 - 编译期类型检查&#xf…

爆破片和安全阀

一、爆破片介绍 爆破片是一种用于安全释放压力的结构&#xff0c;通常应用于压力容器、管道和设备中&#xff0c;以防止由于压力过高而导致的灾难性故障。在压力超过设定值时&#xff0c;爆破片会破裂&#xff0c;从而迅速将过压泄放&#xff0c;保护设备和人员安全 爆破片通常…

Java——IO流(二)-(4/7):不同编码读取乱码的问题,转换流-InputStreamReader、OutputStreamWriter

目录 不同编码读取出现乱码的问题 转换流 InputStreamReader(字符输入转换流) 实例演示(1) OutputStreamWriter(字符输出转换流) 实例演示(2) 不同编码读取出现乱码的问题 如果代码编码和被读取的文本文件的编码是一致的&#xff0c;使用字符流读取文本文件时不会出现乱…

达梦数据库系列—22. DPC集群原理

目录 DPC原理 1、系统原理 2、元数据服务 3、数据存储 4、执行计划的生成 5、计算与存储分离 6、动态增删节点 7、分布式事务一致性 第一阶段 预提交 第二阶段 提交 8、RAFT 归档 9、自动故障处理 DPC原理 计划生成节点&#xff08;SP&#xff09;&#xff1a;对外…

猫狗图像分类-划分数据集

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

[FreeRTOS 基础知识] 互斥量 概念

文章目录 基础知识互斥量互斥量与信号量区别优先级反转优先级继承小结 基础知识 [FreeRTOS 基础知识] 信号量 概念 互斥量 互斥量&#xff08;Mutex&#xff0c;全称&#xff1a;Mutual Exclusion&#xff09;&#xff0c;在计算机科学中&#xff0c;是一种用于防止多个进程同…

大学教师门诊预约小程序-计算机毕业设计源码73068

摘要 在当今数字化、信息化的浪潮中&#xff0c;大学校园的服务管理正朝着智能化、便捷化的方向迈进。为了优化大学教师的医疗体验&#xff0c;提升门诊预约的效率和便捷性&#xff0c;我们基于Spring Boot框架设计并实现了一款大学教师门诊预约小程序。该小程序不仅提供了传统…

压测工具---Ultron

压测工具&#xff1a;Ultron 类型&#xff1a;接口级和全链路 接口级 对于接口级别的压测我们可以进行 http接口压测、thrift压测、redis压测、kafka压测、DDMQ压测、MySQL压测等&#xff0c;选对对应的业务线、选择好压测执行的时间和轮数就可以执行压测操作了 全链路 对…