当前位置: 首页 > news >正文

QT系列教程(14) QT 按键事件

按键事件

按键事件是Qt提供的特有的事件体系,其头文件为QKeyEvent,这一篇我们通过一个demo演示按键事件,首先我们创建一个QApplication项目,创建类名为Widget,继承自QWidget,然后在ui里添加一个button。重写Widget的keyPressEvent函数

void Widget::keyPressEvent(QKeyEvent *event){
    //判断是ctrl+M
    if(event->modifiers() == Qt::ControlModifier){
        if(event->key() == Qt::Key_M  && windowState() != Qt::WindowFullScreen){
            setWindowState(Qt::WindowFullScreen);
            return;
        }
        return;
    }

    //如果按下的是ESC
    if(event->key() == Qt::Key_Escape && windowState() == Qt::WindowFullScreen){
        setWindowState(Qt::WindowNoState);
        return;
    }
}

在这个按键事件里,我们判断了是否按下控制键Ctrl,如果按下了控制键Ctrl并且按下M键,则进行之后的判断逻辑。
如果此时窗口并不是全屏,那么就将窗口设置为全屏,否则什么都不做。
如果按下的是ESC键,且此时窗口全屏,则将窗口设置为正常状态,非全屏。

控制按钮移动

我们可以通过上下左右键控制按钮移动,需求如下
1 当我们按住一个方向键时控制按钮朝一个方向移动
2 当我们同时按住两个方向键则让其朝着两个方向的中间移动

void Widget::keyPressEvent(QKeyEvent *event){
   
    bool b_upflag= false;
    bool b_downflag = false;
    bool b_leftflag = false;
    bool b_rightflag = false;

    if(event->key() == Qt::Key_Up){
        if(event->isAutoRepeat()){
            auto curpos = ui->pushButton->pos();
            curpos.setY(curpos.y()-5);
            ui->pushButton->move(curpos);
            return;
        }else{
            b_upflag = true;
        }

    }

    if(event->key() == Qt::Key_Left){
        if(event->isAutoRepeat()){
            auto curpos = ui->pushButton->pos();
            curpos.setX(curpos.x()-5);
            ui->pushButton->move(curpos);
            return;
        }else{
            b_leftflag = true;
        }
    }


    if(event->key() == Qt::Key_Down){
        if(event->isAutoRepeat()){
            auto curpos = ui->pushButton->pos();
            curpos.setY(curpos.y()+5);
            ui->pushButton->move(curpos);
            return;
        }else{
            b_downflag = true;
        }

    }

    if(event->key() == Qt::Key_Right){
        if(event->isAutoRepeat()){
            auto curpos = ui->pushButton->pos();
            curpos.setX(curpos.x()+5);
            ui->pushButton->move(curpos);
            return;
        }else{
            b_rightflag = true;
        }
    }

    auto curpos = ui->pushButton->pos();
    if(b_upflag){
        curpos.setY(curpos.y()-5);
    }

    if(b_downflag){
        curpos.setY(curpos.y()+5);
    }

    if(b_leftflag){
        curpos.setX(curpos.x()-5);
    }

    if(b_rightflag){
        curpos.setX(curpos.x()+5);
    }

     ui->pushButton->move(curpos);

}

我们通过isAutoRepeat函数判断某一个按键是否被单一按下,如果是,则直接移动按钮的位置。
否则我们根据按键的方向设置对应的标记,最后根据标记设置按钮的位置,以达到朝着两个方向的中间移动的效果。

总结

源码链接:
我们通过isAutoRepeat函数判断某一个按键是否被单一按下,如果是,则直接移动按钮的位置。
否则我们根据按键的方向设置对应的标记,最后根据标记设置按钮的位置,以达到朝着两个方向的中间移动的效果。

总结

源码链接:
https://gitee.com/secondtonone1/qt-learning-notes

相关文章:

  • 【sentry】sentry报错信息转发常用办公聊天工具
  • 嵌入式工控机在汽车制造中的卓越表现
  • 本地Docker部署雷池WAF让网站安全监测更简单无需复杂配置
  • 根据开始和结束日期,获取每一天和每个月的开始和结束日期的list
  • IDEA接入阿里云百炼中免费的通义千问[2025版]
  • 简单记录一下Oracle数据库与mysql数据库注入的不同。
  • 配置安全网站
  • c++_队列习题
  • 【每日八股】计算机网络篇(四):HTTP
  • stm32 f4 flash 调用时卡死
  • Flask Jinja语法总结篇
  • MySQL8.0窗口函数
  • 请谈谈 TypeScript 中的接口(interface)和类型别名(type alias),它们的区别是什么?
  • ThinkPHP8.0+MySQL8.0搭建简单实用电子证书查询系统
  • Kafka×DeepSeek:智能决策破取经八十一难!
  • 若依-导出后端解析
  • MySQL性能调优实战手册:从慢查询到执行计划全解析
  • springmvc想要一个模块使用相同的url的前缀,怎么处理
  • 配置 Thunderbird 以使用 outlook 邮箱
  • WebGPU:前端图形性能的新纪元——开启浏览器高性能计算新时代
  • 南京英文网站建设/网站建设推广多少钱
  • 如何给客户更好的做网站分析/网上国网推广
  • 手机当服务器建网站/太原网站建设
  • 网站配色的方案/百度投诉电话24小时
  • 中国建设银行网站签名通下载安装/百度站长app
  • 网站建设 方案/在线培训管理系统