.pro

#-------------------------------------------------
#
# Project created by QtCreator 2016-05-30T22:20:17
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = mykeyevent
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QKeyEvent>
#include <QDebug>

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

    setFocus();                                          // 使主界面获得焦点

    keyUp = false;        // 初始化变量
    keyLeft = false;
    move = false;

}

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

void Widget::keyPressEvent(QKeyEvent *event)       // 键盘按下事件
{
    //    if(event->key() == Qt::Key_Up){                  // 如果是向上方向键
    //        qDebug() << "press:"<<event->isAutoRepeat(); // 是否自动重复
    //    }

    if (event->key() == Qt::Key_Up) {
        if(event->isAutoRepeat()) return;    // 按键重复时不做处理
        keyUp = true;                        // 标记向上方向键已经按下
    }
    else if (event->key() == Qt::Key_Left) {
        if (event->isAutoRepeat()) return;
        keyLeft = true;
    }

}

void Widget::keyReleaseEvent(QKeyEvent *event)     // 按键释放事件
{
    //    if(event->key() == Qt::Key_Up){
    //        qDebug() << "release:"<< event->isAutoRepeat();
    //        qDebug() << "up";
    //    }

    if (event->key() == Qt::Key_Up) {
        if (event->isAutoRepeat()) return;
        keyUp = false;                      // 释放按键后将标志设置为false
        if (move) {                         // 如果已经完成了移动
            move = false;                   // 设置标志为false
            return;                         // 直接返回
        }
        if (keyLeft) {                       // 如果向左方向键已经按下且没有释放
            ui->pushButton->move(30, 80);    // 斜移
            move = true;                    // 标记已经移动
        } else {                            // 否则直接上移
            ui->pushButton->move(120, 80);
        }
    }
    else if (event->key() == Qt::Key_Left) {
        if (event->isAutoRepeat()) return;
        keyLeft = false;
        if (move) {
            move = false;
            return;
        }
        if (keyUp) {
            ui->pushButton->move(30, 80);
            move = true;
        } else {
            ui->pushButton->move(30, 120);
        }
    }
    else if (event->key() == Qt::Key_Down) {
        ui->pushButton->move(120, 120);  // 使用向下方向键来还原按钮的位置
    }

}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    bool keyUp;           // 向上方向键按下的标志
    bool keyLeft;         // 向左方向键按下的标志
    bool move;            // 是否完成了一次移动


protected:
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);

};

#endif // WIDGET_H

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐