Qt 方向键事件

.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

Qt中,方向键可以用于控制焦点在不同控件之间切换。在默认情况下,焦点可以通过Tab键在控件之间切换,而方向键可以改变焦点的默认行为。 当用户按下方向键时,Qt会根据当前焦点所在的控件和按下的方向键来确定下一个焦点应该是哪个控件。例如,如果当前焦点在一个文本框中,按下向下方向键,焦点可能会切换到下一个可接受焦点的控件,例如下一个文本框或者一个按钮。同样地,按下向上、向左或者向右方向键时,焦点会在可接受焦点的控件之间切换。 在Qt中,可以通过重写控件的focusInEvent()或者focusOutEvent()函数来处理焦点切换时的事件。在这些事件中,可以根据需要来修改控件的样式或者执行其他自定义操作。可以利用Qt事件过滤器机制来拦截和处理特定的焦点切换事件。 此外,Qt还提供了一些属性和函数来控制焦点切换的顺序和规则。使用QWidget的setFocusPolicy()函数可以设置控件接受焦点的策略,例如设置为Qt::StrongFocus表示控件可以接受焦点,并且方向键可以改变焦点。此外,可以使用QWidget的setTabOrder()函数来设置控件之间的Tab键切换顺序,从而影响焦点切换时的方向键切换行为。 总之,Qt提供了灵活而强大的机制来处理方向键控制焦点的功能,开发者可以根据自己的需求来定制焦点切换的行为和样式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级D洋葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值