【Qt开发流程】之事件系统3:键盘事件

2023-12-05

序章

以下链接是拖放事件介绍和使用示例:
【Qt开发流程】之拖放操作1:介绍链接: https://blog.csdn.net/MrHHHHHH/article/details/134626484
【Qt开发流程】之拖放操作2:使用链接: https://blog.csdn.net/MrHHHHHH/article/details/134632006
以下链接是事件系统及键盘事件描述及示例:
【Qt开发流程】之事件系统1:事件系统描述及事件发生流程链接: https://blog.csdn.net/MrHHHHHH/article/details/134722922
【Qt开发流程】之事件系统2:鼠标事件及滚轮事件链接: https://blog.csdn.net/MrHHHHHH/article/details/134756089

键盘事件

QKeyEvent 类描述一个键盘事件。
当键盘有键按下或者释放时,键盘事件便会被发送给拥有输入焦点的部件。
关键事件包含一个特殊的接受标志,指示接收方是否将处理该关键事件。这个标志默认情况下是为QEvent::KeyPress和 QEvent::KeyRelease 设置的,所以在处理键事件时不需要调用 accept() 。对于QEvent::ShortcutOverride,接收者需要显式地接受事件来触发覆盖。在键事件上调用ignore()将把它传播到父小部件。事件沿着父小部件链向上传播,直到小部件接受它或事件过滤器使用它。
QWidget::setEnabled() 函数可用于启用或禁用小部件的鼠标和键盘事件。
事件处理程序 QWidget::keyPressEvent() QWidget::keyReleaseEvent() QGraphicsItem::keyPressEvent() QGraphicsItem::keyReleaseEvent() 接收关键事件。
QKeyEvent key() 函数可以获得具体的按键,按键类型在 Qt::Key 枚举中。
如:
在这里插入图片描述
需注意:
Ctrl Shift 键,需要使用 modifiers() 函数获取。
在这里插入图片描述

示例

以下是一个使用键盘事件的示例。
实现组合键控制控件移动。
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


protected:
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);
private:
    Ui::MainWindow *ui;

    bool bIsUp = false;
    bool bIsRight = false;
    bool bMove = false;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QKeyEvent>

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

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

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if(event->modifiers() == Qt::ControlModifier)
    {
        if(event->key() == Qt::Key_M)
            setWindowState(Qt::WindowMaximized);
        if(event->key() == Qt::Key_N)
        {
            setWindowState(Qt::WindowNoState);
        }
    }else if(event->type() == QEvent::KeyPress){
        switch (event->key()) {
        case Qt::Key_Up:
        {
            if(event->isAutoRepeat())
                return;
            bIsUp = true;
        }
            break;
        case Qt::Key_Right:
        {
            if(event->isAutoRepeat())
                return;
            bIsRight = true;
        }
            break;
        default:
            break;
        }
    }
        QMainWindow::keyPressEvent(event);

}

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_Up:
    {
        if(event->isAutoRepeat())
            return;

        bIsUp = false;
        if(bMove)
        {
            bMove = false;
            return;
        }
        if(bIsRight)
        {
            ui->pushButton->move(ui->pushButton->pos().x() + 10, ui->pushButton->pos().y() + 10);
            bMove = true;
        }else {
            ui->pushButton->move(80, 60);
        }
    }
        break;
    case Qt::Key_Right:
    {
        if(event->isAutoRepeat())
            return;
        bIsRight = false;
        if(bMove)
        {
            bMove = false;
            return;
        }
        if(bIsUp)
        {
            ui->pushButton->move(ui->pushButton->pos().x() + 10, ui->pushButton->pos().y() + 10);
            bMove = true;
        }else {
            ui->pushButton->move(80, 60);
        }
    }
        break;
    default:
    {

    }
        break;
    }

    QMainWindow::keyReleaseEvent(event);
}

以上代码解释:

  • keyPressEvent()重载,处理键盘按下事件,当重复按下时,返回,记录按下状态
  • keyReleaseEvent()重载,处理键盘释放事件,当按下向上的同时,按下向右键,控件会在x , y 的基础上右下偏移10个像素
  • 当只有一个按键时,控件恢复到默认坐标

效果

因为自动重复返回了,所以效果会不是那么好。

键盘事件

结论

为什么一看书,就困呢?因为书,是梦开始的地方

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Qt开发流程】之事件系统3:键盘事件 的相关文章

  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • Qml 和模糊图像

    我想使用 QML 实现模糊效果 我找到了有关 效果 模糊 的参考资料 例子 http qt gitorious org lscunha qt components lscunha qt components blobs d78feec567
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • QStyledItemDelegate 绘制自定义小部件失败

    在我的一个项目中 我使用的是QTableWidget为了显示一些复杂的计算结果 为了提高表格的可读性 我需要在单个表格单元格内显示两个对齐的值 后来我想通过使用颜色或箭头等来进一步自定义小部件 为此我源自QStyledItemDelegat
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • 如何在QT上暂停和重新启动Qtimer

    我有 Ubuntu 我正在使用 IDEQT on C 我将暂停和恢复计时器 例如 void Ordonnancer les taches on pushButton clicked connect dataTimer SIGNAL time
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • Qt 5.1.1 与 Visual Studio 2012 - 这些 QT 版本无法访问

    打开 Visual Studio 时出现此错误 我安装自http qt project org downloads http qt project org downloads 适用于 Windows 64 位的 Qt 5 1 1 VS 20
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某

随机推荐