精华内容
下载资源
问答
  • 多个按键同时按
    千次阅读
    2021-11-15 11:01:07

    在style里添加

         <item name="android:splitMotionEvents">false</item>

    更多相关内容
  • 多个按键同时按下的实现方法,目前实现了左、右、上、下、Enter按键以及左+上+Enter的实现,读者可以自行拓展该程序。
  • Qt 及 QML 处理多个按键同时按

    千次阅读 2020-07-30 00:07:00
    想写判断哪些方向键同时按下的逻辑,结果发现 Qt 的按键事件只能取到单个键值,而QKeyEvent::modifiers() 又只能获取 Ctrl 或者 Shift 这种辅助按键。一番百度之后,发现可以使用容器保存按键值,在keyPressEvent ...

    1.思路

    想写个判断哪些方向键同时按下的逻辑,结果发现 Qt 的按键事件只能取到单个键值,而 QKeyEvent::modifiers() 又只能获取 Ctrl 或者 Shift 这种辅助按键。一番百度之后,发现可以使用容器保存按键值,在 keyPressEvent 添加按键值,在 keyReleaseEvent 移除按键值。

    不过单单处理按键的按下和弹起还不够,还需要注意一些事项:

    A.弹起其中一个按键时,按键事件的触发会停顿一下。所以,不能在按键事件里直接处理逻辑,需要加个定时器来遍历我们的键值容器;

    B.按键长按时会重复触发按下和弹起两个事件,这可能导致我们的键值容器在遍历时值不对(比如长按触发按键事件,导致定时器触发时我们的容器正好弹出键值就为空了)。所以,我们要单独判断下 QKeyEvent 的 isAutoRepeat,如果是自动重复触发就不处理。

    实现效果,以移动方块为例(两个方向键同时按下就是斜着移动):

    分别展示 QWidget 和 QML 的示例。

    2.QWidget 代码

    #ifndef UNIT4MOVE_H
    #define UNIT4MOVE_H
    
    #include <QOpenGLWidget>
    #include <QOpenGLFunctions_4_0_Compatibility>
    #include <QMatrix4x4>
    #include <QVector3D>
    #include <QTimer>
    
    //按键移动物体
    class Unit4Move : public QOpenGLWidget, protected QOpenGLFunctions_4_0_Compatibility
    {
        Q_OBJECT
    public:
        explicit Unit4Move(QWidget *parent = nullptr);
    
    protected:
        //设置OpenGL资源和状态。在第一次调用resizeGL或paintGL之前被调用一次
        void initializeGL() override;
        //渲染OpenGL场景,每当需要更新小部件时使用
        void paintGL() override;
        //设置OpenGL视口、投影等,每当尺寸大小改变时调用
        void resizeGL(int width, int height) override;
    
        //按键按下
        void keyPressEvent(QKeyEvent *event) override;
        //按键释放
        void keyReleaseEvent(QKeyEvent *event) override;
        //设置切换显示的时候获取焦点
        void showEvent(QShowEvent *event) override;
    
    private:
        //顶点列表
        QList<QVector3D> vertexList;
        //移动
        float xOffset=0;
        float yOffset=0;
        //当前按键按下的列表
        //因为Qt按键事件只能判断出一个键值和辅助键值的组合,
        //所以自己保存按下的按键
        QSet<int> pressedKeys;
        //刷新定时器
        QTimer *updateTimer;
    };
    
    #endif // UNIT4MOVE_H
    

     

    #include "Unit4Move.h"
    
    #include <QPainter>
    #include <QVector3D>
    #include <QtMath>
    #include <QKeyEvent>
    #include <QDebug>
    
    Unit4Move::Unit4Move(QWidget *parent)
        : QOpenGLWidget(parent)
    {
        //默认没得焦点,没法接收按键
        setFocusPolicy(Qt::StrongFocus);
    
        //多个按键按下还有一个问题,就是最后那个按键弹起后就不会重复触发了
        //所以刷新我们可以用定时器来判断容器列表,release时判断为空就关,press就开
        updateTimer=new QTimer(this);
        connect(updateTimer,&QTimer::timeout,[this]{
            //qDebug()<<"timeout"<<pressedKeys;
            if(pressedKeys.isEmpty()){
                updateTimer->stop();
                return;
            }
            for(int key:pressedKeys)
            {
                switch (key) {
                case Qt::Key_Up:
                    yOffset+=0.1f;
                    break;
                case Qt::Key_Down:
                    yOffset-=0.1f;
                    break;
                case Qt::Key_Left:
                    xOffset-=0.1f;
                    break;
                case Qt::Key_Right:
                    xOffset+=0.1f;
                    break;
                default:
                    break;
                }
            }
            update();
        });
    }
    
    void Unit4Move::initializeGL()
    {
        //此为Qt接口:为当前上下文初始化OpenGL函数解析
        initializeOpenGLFunctions();
    
        //初始化
        //矩形分为两个三角
        vertexList=QList<QVector3D>{
        {0.5f,0.5f,0.0f},
        {-0.5f,0.5f,0.0f},
        {-0.5f,-0.5f,0.0f},
        {-0.5f,-0.5f,0.0f},
        {0.5f,-0.5f,0.0f},
        {0.5f,0.5f,0.0f} };
    
        //窗口清除的颜色
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }
    
    void Unit4Move::paintGL()
    {
        //清除颜色缓冲区
        glClear(GL_COLOR_BUFFER_BIT);
    
        //【给opengl设置矩阵】
        //当前矩阵为模型矩阵
        glMatrixMode(GL_MODELVIEW);
        //重置当前指定的矩阵为单位矩阵,恢复坐标系
        //OpenGL是状态机,会保存之前的状态
        glLoadIdentity();
        glOrtho(-5,5,-5,5,-15,15);
        glTranslatef(xOffset,yOffset,0);
        glRotatef(45,0,0,1);
    
        //填充颜色
        glColor3f(0.0f,0.5f,1.0f);
        //绘制三角(坐标范围默认为[-1,1])
        glBegin(GL_TRIANGLES);
        for(const QVector3D &vertex:vertexList){
            glVertex3f(vertex.x(),vertex.y(),vertex.z());
        }
        glEnd();
    
        //绘制文本
        QPainter painter(this);
        painter.setPen(QColor(255,255,255));
        painter.drawText(20,40,"点击获取焦点后,按方向键移动!");
    }
    
    void Unit4Move::resizeGL(int width, int height)
    {
        //视口,靠左下角缩放
        glViewport(0,0,width,height);
    }
    
    void Unit4Move::keyPressEvent(QKeyEvent *event)
    {   
        QOpenGLWidget::keyPressEvent(event);
        //按键按下,key值放入容器,如果是长按触发的repeat就不判断
        if(!event->isAutoRepeat())
            pressedKeys.insert(event->key());
        //判断是否运行,不然一直触发就一直不能timeout
        if(!updateTimer->isActive())
            updateTimer->start(100);
    }
    
    void Unit4Move::keyReleaseEvent(QKeyEvent *event)
    {
        QOpenGLWidget::keyReleaseEvent(event);
        //按键释放,从容器中移除,如果是长按触发的repeat就不判断
        if(!event->isAutoRepeat())
            pressedKeys.remove(event->key());
        if(pressedKeys.isEmpty()){
            updateTimer->stop();
        }
    }
    
    void Unit4Move::showEvent(QShowEvent *event)
    {
        QOpenGLWidget::showEvent(event);
        setFocus();
    }
    

    3.QML 代码

    import QtQuick 2.12
    import QtQuick.Window 2.12
    import QtQuick.Controls 2.12
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("GongJianBo")
    
        //存储当前按下的键值,使用ES6的集合类型
        property variant pressedKeys:new Set()
    
        Rectangle{
            id: item
            //anchors.centerIn: parent
            x:100
            y:100
            width: 100
            height: 100
            color: "green"
    
            focus: true
            //按键按下
            Keys.onPressed: {
                //键值放入set
                if(!event.isAutoRepeat){
                    pressedKeys.add(event.key)
                }
                if(!timer.running){
                    timer.start()
                }
            }
            //按键释放
            Keys.onReleased: {
                //键值弹出set
                if(!event.isAutoRepeat){
                    pressedKeys.delete(event.key)
                }
                if(pressedKeys.size<=0){
                    timer.stop()
                }
            }
        }
    
        Timer{
            id:timer
            repeat: true
            interval: 50
            onTriggered: {
                //console.log(pressedKeys.size)
                if(pressedKeys.size<=0){
                    timer.stop()
                    return
                }
    
                //遍历存储的键值,实现同时处理多个按键按下状态
                for(let key of pressedKeys)
                {
                    switch (key) {
                    case Qt.Key_Up:
                        item.y-=5;
                        break;
                    case Qt.Key_Down:
                        item.y+=5;
                        break;
                    case Qt.Key_Left:
                        item.x-=5;
                        break;
                    case Qt.Key_Right:
                        item.x+=5;
                        break;
                    default:
                        break;
                    }
                }
            }
        }
    }
    

     

    展开全文
  • JS键盘按键监听-多个按键同时按

    千次阅读 2021-05-14 16:05:45
    个按键一起下时,两个事件都会被监听到,但是只有后面一个事件会被响应。

    两个按键一起按下时,两个事件都会被监听到,但是只有后面一个事件会被响应。

            document.onkeydown = function (event) {
                console.log(event.ctrlKey);
                console.log(event.code)
            }
    

    第一种情况是先按Ctrl再按M
    在这里插入图片描述

    第二种是先按M再按Ctrl
    在这里插入图片描述
    说明event.ctrl和按键的顺序无关,只要按了就能返回true,但是event.code只返回后按的那个键

    展开全文
  • 1. if(K10 == 0) 2. { 3. __delay_ms(TWOKEY_DELAY); //两个按键按下的时间差,要小于这个延时,否则判断为单个按键下 4. if(K10 == 0) 5. { 6. if(K7 == 0) 7. { 8. TX_D...

    两个按键 Key1和Key2,三个按键实现三种功能

    1. Key1单独按下
    2. Key2单独按下
    3. Key1和Key2同时按下

    if(Key1 == 0)  
    {  
        __delay_ms(TWOKEY_DELAY);       //两个按键按下的时间差,要小于这个延时,否则判断为单个按键按下
        if(Key1 == 0)  
        {  
            if(Key2 == 0)  
            {  
                function_Press2Keys();  //两个按键同时按下执行函数  
                while(Key2 == 0); //松手检测  
            }  
            else   
            {  
                function_Key1();  //Key1单独按下执行函数
                while(Key1 == 0); //松手检测  
            }  
        }  
    }  
    
    if(Key2 == 0)
    {
        __delay_ms(TWOKEY_DELAY);       //两个按键按下的时间差,要小于这个延时,否则判断为单个按键按下 
        if(Key2 == 0 )
        {
            if(Key1 == 0)
            {
                function_Press2Keys();  //两个按键同时按下执行函数  
                while(Key1 == 0); //松手检测  
            }
            else 
            {
                function_Key2();  //Key2单独按下执行函数
                while(Key2 == 0); //松手检测
            }
        }
        else;
    }    

    展开全文
  • 经典ADC按键电路,多个按键一个IO

    千次阅读 2022-04-11 13:48:42
    经典ADC按键电路,多个按键一个IO,原理图很简单,使用具有ADC功能CPU,用ADC侦测电压的大小来判断。
  • c#实现多个按键同时按下检测

    千次阅读 2011-05-29 14:00:00
    在C#中实现了多个按键同时按下的检测
  • JavaScript同时监听多个按键

    千次阅读 2019-04-01 14:43:00
    JavaScript同时监听多个按键 根据不同需求,查找不同的code值 代码如下:
  • stm32单片机按键消抖、长按、击终极解决方案

    千次阅读 多人点赞 2021-01-29 00:25:56
    如果有更好的解决方案或是发现天神的方案有问题,欢迎大家热烈讨论! 明确按键的使用环境和终极目标 ...对于长按我们希望在按键按下后过一会才反应出来,这是需要唰唰一直响应的,只要不松开程序就一直反应出长按.
  • 一个ADC实现多个按键检测

    千次阅读 2020-11-14 09:58:21
    个按键的检测占用单片机的一个GPIO引脚,原理图如下图所示: 图片来源《程序员小哈自制核心板原理图》 我们以BTN1按键为例,当按键没有下的时候,网络标号KEY1处的电压被10K的上拉电阻拉至3.3V,PB14(KEY1)...
  • JS实现两键盘按键同时触发的事件

    千次阅读 2020-06-10 13:39:37
    做为《JS的事件处理详解》中的一进阶练习,这一节实现两键盘按键一起下的时候,JS能同时响应,而不只是后下的那个。 改进前 改进前代码如下 <!DOCTYPE html> <html> <head> <meta ...
  • 键盘按键一、按键都失灵的情况如果按键所有都失灵的话,首先对键盘上的每键进行盘查,有可能是一键盘被下去的缘故导致其他键都没反应的情况。如果键盘损坏了,可能是键盘老化或者是键盘内部的线路板有污垢...
  • 按键电路是单片机应用中最广泛最简单的一个电路了,实际项目中经常会用到按键,但是一个按键往往需要占用一个IO口,特别是单片机资源比较紧张的情况下,IO就显得更加珍贵了。如果要用到按键,同时又不想浪费IO口,...
  • JavaScript捕获同时多个按键-非组合键

    千次阅读 2017-07-18 15:11:18
    用户同时按下两个或多个按键时,如何判断用户按下了哪些键: 比如如何判断用户同时按下了‘A’和‘H’键 segmentd 的 Clark 提供的思路: Ctl,alt是有专门判断的属性的。如果是其他的组合,我有想法,就是keydown...
  • 单片机 多个按键控制多个led亮灭

    千次阅读 多人点赞 2019-05-09 08:19:31
    下剩余按键下k1 下剩余按键 代码如下 #include <reg52.h> void delay(unsigned int n)//延时函数 { unsigned char i; while(--n) for(i=0;i<125;i++); } void main() { unsign...
  • 在开发中,如果需要使用多个按键时,使用ADKEY,往往可以节省很多IO口,可以节省资源。下面,简单介绍一下ADKEY的使用与经验分享。ADKEY原理:通过不同的电阻进行分压,使每个key下时,IO口读到电压值不同,来确认...
  • android按键连续下事件处理

    千次阅读 2014-09-15 17:15:21
    android中有Button控件,针对Button控件有2非常经典的处理shi
  • 连续选择多个按什么键

    千次阅读 2021-07-25 07:14:02
    连续选择多个按键的方法如下:1、如果是多个文件,而只需要选择其中几个,可以按住CTRL键不放手,然后在需要的文件名上点击鼠标左键,选择完成后松开CTRL键。2、如果是多个文件,需要顺序选取,可以在要选择的第一...
  • FPGA---多按键消抖检测

    千次阅读 2020-08-05 16:05:36
    这样的话就相当于用了4个不同的寄存器对20ms计数,对 FPGA内部资源浪费比较大,那么能不能用一个20ms的寄存器同时判断四个按键呢。 可以参考单按键检测的思路,首先将按键的当前状态和上一个状态存储起来,然后...
  • C51单片机——多个按键中断控制实现 1.实现代码 /* * 2018-10-22 */ #include&lt;STC15F2K60S2.h&gt; #define uchar unsigned char #define uint unsigned int sbit KEY_1 = P3^2; sbit KEY_2 = P3^3; ...
  • // 函数功能:按键扫描 //这是我第三次对按键扫描的优化,为什么我要这么做呢,很简单, //我只想将简单的事情不断完善好 //第一次发表:http://blog.csdn.net/chuangwu2009/article/details/9466715 //第一次发表:...
  • 本篇将在上一篇按键中断的基础上,实现两个按键控制系统十几乃至几十中状态,节省器件,节约空间,节约IO口,同时又能实现复杂功能,目标就两个字”节约精简“。 按键实现 需要了解本篇,需要对上篇有个大致了解。只...
  • arduino按键控制多个LED灯

    万次阅读 2019-09-15 21:23:52
    按键 源代码如下: void setup() { pinMode(ledPin, OUTPUT); //设置LED管脚输出模式 pinMode(buttonPin, INPUT_PULLUP); //设置按键管脚上拉输入模式 Serial.begin(9600); } void loop() { buttonState = di....
  • 一个ADC做多个按键扫描检测

    千次阅读 2019-04-09 09:31:02
    独立按键直接用MCU的I/O管脚构成的单个按键电路,其特点式每个按键单独占用一个I/O,每个按键的工作不会影响其他I/O的状态。独立按键很浪费MCU管脚,但编程比较简单。 2、矩阵按键 矩阵键盘又称行列键盘,它是用四...
  • ADC检测多个按键

    万次阅读 2017-10-11 18:28:34
    ADC检测实现简单实用的按键方法:仅需要一个AD口和若干个电阻就可实现多个按键的输入检测。 工作原理:下按键时,通过电阻分压得到不同的电压值。 摘录网上的图片 根据上述电路,4个1K的电阻
  • 实验简介使用两个按键,分别控制两个LED灯的点亮与关闭。一下,亮,再一下灭,走起......先说明一下4脚按键开关的工作原理 示例效果BOM表Arduino Uno * 1LED *2(各什么颜色你喜欢就好)4脚按键开关 *2面包板 *1...
  • STM32程序:按键长按和短的判断,用来控制LED灯,有借鉴了其他程序,但是有细节上的不同。 (因为这里做的按键是速度,所以写的SP,根据自己情况自己定义就好) 用定时器中断定时,配置部分就不写了,都差不多 time...
  • 我们在操作电脑的时候会需要用到选定多个文件夹。那么该如何操作呢?下面学习啦小编就为大家介绍一下具体的操作方法吧,欢迎大家参考和学习。以下方法只是合适在同级目录下多文件时使用。所谓同级目录,简单的说打开...
  • 例如shift跟空格,由于我以前经常要加速大跳,突然发现shift跟空格一起没有效果,语言设置里也没有相关的快捷键设置到,所以网上查询了一番,至此,问题终于解决,网上虽然有提到解决的方法,但是大多是零散的不太...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 248,281
精华内容 99,312
关键字:

多个按键同时按

友情链接: acxosv071.rar