QDemo之按键长按

简单说明下我们平时理解的KeyEvent:

  1. Press = 按键按下
  2. Release = 按键释放
  3. Click = 单击,1和2的组合情况
  4. LongPress = 长按,我平时理解的是一直在触发Press,跟2、3没有任何关系。

而Qt里的QKeyEvent有点不一样:

  1. Press = 按键按下,这个一样
  2. Release = 按键释放,这个也一样
  3. Click = 单击,这个还是一样
  4. LongPress = 长按,Qt里有这个状态但是不叫这个名字而叫QKeyEvent::isAutoRepeat(),并且长按的时候会不断的重复触发1、2的状态

QKeyEvent::isAutoRepeat()返回的是个布尔型的值,

也就是说我们要通过QKeyEvent的isAutoRepeat()函数返回的true或false来判断是否是按键长按状态

例子如下:

新建项目:KeyLongPress

main.cpp就不多说了...

keyLongPress.ui是默认的,什么都没改。

//keyLongPress.h

#ifndef KEYLONGPRESS_H
#define KEYLONGPRESS_H

#include <QDebug> //别忘了我
#include <QWidget>
#include <QKeyEvent> //也别忘了我

namespace Ui {
class KeyLongPress;
}

class KeyLongPress : public QWidget
{
    Q_OBJECT

public:
    explicit KeyLongPress(QWidget *parent = 0);
    ~KeyLongPress();

protected:
    void keyPressEvent(QKeyEvent *event); //按键按下事件
    void keyReleaseEvent(QKeyEvent *event); //按键释放事件

private:
    Ui::KeyLongPress *ui;
};

#endif // KEYLONGPRESS_H
 

...

//keyLongPress.cpp

#include "keyLongPress.h"
#include "ui_keyLongPress.h"

KeyLongPress::KeyLongPress(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::KeyLongPress)
{
    ui->setupUi(this);
}

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

//QMouseEvent没有isAutoRepeat()方法...无语了,
//这样有些操作就不方便实现了,
//比如长按鼠标多少秒呼出某个(登录)窗口啥的。

//! [按键按下事件-Begin]
void KeyLongPress::keyPressEvent(QKeyEvent *event)
{
    if(event->isAutoRepeat()){
        qDebug() <<  "按键长按中...";
    }
    else{
        qDebug() << "按键按下";
    }
}
//! [按键按下事件-End]

//! [按键释放事件-Begin]
void KeyLongPress::keyReleaseEvent(QKeyEvent *event)
{
    if(event->isAutoRepeat()){
        qDebug() <<  "按键不断释放...";
    }
    else{
        qDebug() << "按键释放";
    }
}
//! [按键释放事件-End]
 

运行之后,测试效果:

你Click看下输出:是只有1次Press和1次Release的,

长按看下输出:是Press和Release一直在不停的输出的。

示意图:

时间: 2024-12-19 10:58:49

QDemo之按键长按的相关文章

Android中屏蔽&quot;电源键长按&quot;、&quot;Home键&quot;、&quot;Home键长按&quot;

Android中屏蔽"电源键长按"."Home键"."Home键长按"    这几个"按钮"的触发,都会产生一个Action == Intent.ACTION_CLOSE_SYSTEM_DIALOGS的通知    区分他们三个的不同事件的参数,就是随着Intent带过来的reason字符串,分别对应    "电源键长按"(globalscreen)."Home键"(homekey).&q

QDemo - Analog clock模拟时钟学习并改进

调用函数setRenderHint(QPainter::Antialiasing,true),使绘制时边缘平滑,使用颜色浓度的变化,把图形的边缘转换为象素时引起的扭曲变形尽可能减少,在支持这一功能的平台或者绘图设备上得到一个平滑的边缘. QTimer类提供了定时器信号和单触发定时器. 它在内部使用定时器事件来提供更通用的定时器.QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽.当这段时间过去了,它将会发射timeout()信号. 我

QDemo之前置声明

前置声明 = Forward Declaration 对于一个刚刚接触include写法的童鞋来说, 突然看到很多人用如下写法:不知甚解否? #ifndef DIALOG_H #define DIALOG_H #include <QDialog> //! [前置声明] QT_BEGIN_NAMESPACE class QPushButton; class QLabel; class QLineEdit; QT_END_NAMESPACE //! [前置声明] class Dialog:publ

QDemo之Javascript调用Qt方法

源码分享: 链接:http://pan.baidu.com/s/1pJzN1Dx 密码:5nct 上面的例子是基于Qt5.4.1的,编译不了的,可以直接参考源码内容,有中文注释 关键点: 1.Qt方法必须为public slots,才能在Javascript里正常调用: 2.Qt里的QWebView.page.mainFrame需要调用该方法:addToJavaScriptWindowObject(): 3.QWebView.page.mainFrame的javaScriptWindowObje

QDemo之QStandardItemModel

自定义树形模型 //treeView.h //不要忘了包含这2个头文件:QStandardItem/QStandardItemModel public:QStandardItemModel *getTreeModel(); //treeView.cpp //获取树形模型 QStandardItemModel *TreeView::getTreeModel() { QStandardItemModel *model = new QStandardItemModel(this); QStandard

Android随笔之——按键长按事件onKeyLongPress

现在安卓手机实体键是越来越少了,但还是有的,恰好自己就碰上了:按键的长按事件...百度了一些博客,内容都基本上是完全一样的,虽然可以捕获到长按事件,但却会和正常的单击冲突.幸好最近开个VPN,google,耶~正确答案马上呈现在眼前,特此记录,以防不时之需. 这里我就直接贴谷歌的代码的,很容易懂,不解释,原文 1 private boolean shortPress = false; 2 3 @Override 4 public boolean onKeyLongPress(int keyCod

Qt 按键长按的处理

keyPressEvent()部分代码: if (e->key() == Qt::Key_A && !e->isAutoRepeat()) {   if (!mPressFlag_A)        {             mKeyDirection.x = -1;//这里就是真正按键按下触发的事件         }         mPressFlag_A = true;     } keyReleaseEvent()部分同理: if (e->key() == Q

python+adb实现物理按键长按(比如长按关机)

1)打开CMD,输入adb shell getevent >e:/test.txt  //该命令用来获取按键对应的event事件 2)手动点击Power键,按ctlr+C键,退出 3)打开test.txt文件,在里面查找event,我抓取到的结果如下: 4)获取到event之后,我们就可以使用sendevent命令来发送指令了,具体代码如下 import os import time os.system("adb shell sendevent /dev/input/event0 1 11

Memcached安装使用和源码调试

memcached官网:http://memcached.org/ 一.安装 下载 # wget http://www.memcached.org/files/memcached-1.4.25.tar.gz 解压 # tar xzvf memcached-1.4.25.tar.gz #cd memcached-1.4.25 配置 #./configure --prefix=/usr/local/memcached --with-libevent=/usr 注意这里选择libevent的位置即可