首页 > 其他分享 >QT事件触发顺序探讨:处理自定义事件与系统事件的冲突

QT事件触发顺序探讨:处理自定义事件与系统事件的冲突

时间:2024-05-30 15:57:17浏览次数:19  
标签:case Qt 自定义 break 事件 Key 按键 QT

1. 课题背景

  在项目开发过程中用到了纯按键的QT交互,我们通过自定义以下全局键盘事件类进行交互的实现:

class KEYPRESSFILTER_EXPORT KeyPressFilter : public QObject
{
    Q_OBJECT
public:
    static KeyPressFilter *instance() {
        if (m_instance == nullptr) {
            m_instance = new KeyPressFilter();
        }
        return m_instance;
    }
protected:
    bool eventFilter(QObject *obj, QEvent *event) override;
    /////////////////////////////////  ESC按键焦点栈及方法
public:
    /**
     * @brief 压栈,保存当前焦点
     */
    void pushFocus(QWidget *widget);
    /**
     * @brief 出栈,获取上一个焦点
     */
    QWidget *popFocus();    
    void handleEscKey();
    void handleUpKey();
    void handleDownKey();
private:
    static KeyPressFilter *m_instance;
    QStack<QWidget*> m_focusStack; // 焦点堆栈
    void focusNextButton();
    void focusPreviousButton();
    void sendClicked();
    explicit KeyPressFilter();
};
//////////////////////////////////////////////////////////////////////////////////////////////////////// 事件回调函数
/**
 * @brief 按键交互事件函数
 */
bool KeyPressFilter::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        switch (keyEvent->key()) {
            //  clicked信号发送按键
        case Qt::Key_Return:
        case Qt::Key_Enter:
            qDebug() << "Enter pressed";
            sendClicked();
            return true;
            break;
            // 上选按键
        case Qt::Key_Up:
            qDebug() << "Up arrow pressed";
            handleUpKey();
            break;
            //  下选按键
        case Qt::Key_Down:
            qDebug() << "Down arrow pressed";
            handleDownKey();
            break;
            //  左选按键
        case Qt::Key_Left:
            qDebug() << "Left arrow pressed";
            focusPreviousButton();
            return true; // 拦截事件,防止进一步传播
            break;
            //  右选按键
        case Qt::Key_Right:
            qDebug() << "Right arrow pressed";
            focusNextButton();
            return true; // 拦截事件,防止进一步传播
            break;
            //  Esc按键
        case Qt::Key_Escape:
            qDebug() << "Esc pressed";
            handleEscKey();
            sendClicked();
            return true;
            break;
            //  home按键
        case Qt::Key_Home:
            qDebug() << "Home pressed";
            break;
        default:
            break;
        }
    }
    return QObject::eventFilter(obj, event);
}

  需要交互的控件通过 installEventFilter(keyFilter) 安装我们自定义键盘事件,执行相应操作。

2. 自定义事件与默认事件的冲突

  QT在执行事件时优先执行自定义事件,所以我们的自定义事件会优于默认事件执行。

 

标签:case,Qt,自定义,break,事件,Key,按键,QT
From: https://www.cnblogs.com/hw-blog/p/18222538

相关文章

  • 【QT】TCP客户端网络连接
    第一步:.pro工程文件添加QT+=network第二步:.h文件添加代码#ifndefTCPCLIENT_H#defineTCPCLIENT_H#include<QException>#include<QDebug>#include<QTcpSocket>#include<QHostAddress>classTCPClient:publicQObject{Q_OBJECTpublic:TCP......
  • C#自定义事件的写法
    C#事件基于委托例1:只用于学习,理解事件底层原理,不推荐这么写;例2:系统用的就是该方式,例如按钮的Click事件;例3:最简略的写法,但是需要客户代码转换EventArgs;1、事件声明完整格式范例: 1//自定义事件参数,默认以EventArgs结尾,需要继承EventArgs类2publicclassMyEventArgs:......
  • 【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(一)
     SpringDataJPA系列1、SpringBoot集成JPA及基本使用2、SpringDataJPACriteria查询、部分字段查询3、SpringDataJPA数据批量插入、批量更新真的用对了吗4、SpringDataJPA的一对一、LazyInitializationException异常、一对多、多对多操作5、SpringDataJPA自定......
  • 【QT】QHash键值对记录QTcpSocket客户端句柄
    第一步:.h文件代码#ifndefSOCKETMAP_H#defineSOCKETMAP_H#include<QHash>#include<QDebug>#include<QTcpSocket>#include<QException>classSocketMap:publicQObject{Q_OBJECTpublic:SocketMap();public:staticboolupd......
  • TabControl和TabItem的样式自定义:为什么要使用自定义模板?
    在WPF(WindowsPresentationFoundation)中,控件的外观和行为是通过控件模板(ControlTemplate)来定义的。TabControl和TabItem控件也不例外,它们的默认控件模板定义了这些控件的结构和视觉状态。在实际应用中,开发者可能会发现直接设置TabItem的某些属性(例如Background)时不会生效。这篇......
  • js事件基础知识
    事件的基础知识事件三要素:事件源:  事件被触发的对象 谁被触发事件类型:如何触发,什么事件例如鼠标点击,鼠标经过,键盘按下等事件处理程序:通过函数赋值的方式完成常用的事件:1)、鼠标事件onclick   当点击鼠标时运行的事件onmousedown  当按下鼠标按钮时运行的事......
  • Qt window和Linux通过进程名称判断是否有进程存在
    boolCommFunction::isProcessRunning(constQString&processName){QProcessprocess;#ifdefWIN32process.start("tasklist",QStringList()<<"/FI"<<"IMAGENAMEeq"+processName);process.waitForF......
  • 【QT】TCP网络通信
    第一步:.pro工程文件添加QT+=network第二步:.h文件添加#ifndefTCPSERVER_H#defineTCPSERVER_H#include<QException>#include<QDebug>#include<QTcpServer>#include<QTcpSocket>classTcpServer:publicQObject{Q_OBJECTpublic:T......
  • 基于QT的TCP本地与不同局域网(使用公网)的简易聊天工具
    1.前言本文包含了目前平台上大多数的文章所采取的本地tcp构建的聊天室项目,也就是同一局域网通信。同时,我在这里提供不同局域网下实现通信的方法,这里用到的方法是客户端发送消息给服务器,然后服务器再发送给另一个局域网的客户,为了减少工作量,我采取的是用群聊的方式同一接收信息......
  • WPF使用事件聚合器,实现任意页面跨页通信
    前言:最近几天有好几个小伙伴玩WPF,遇到不同页面,不知道要怎么传递消息。于是,我今天就来演示一个事件聚合器的玩法,采用prism框架来实现。作为福利,内容附带了主页面打开对话框时候直接通过参数传递消息的一个小例子,具体请自行围观。以下内容,创建wpf项目以及引用prism和实现依赖注入......