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;

private:
    static KeyPressFilter *m_instance;
    explicit KeyPressFilter();
};
//////////////////////////////////////////////////////////////////////////////////////////////////////// 事件回调函数
/**
 * @brief 按键交互事件函数
 */
bool KeyPressFilter::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress) {

    }
    return QObject::eventFilter(obj, event);
}

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

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

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

3. 解决方案——主动消费按键事件

  当执行自定义事件后,通过主动执行accept函数,将事件消费避免触发默认事件。示例代码如下:

event->accept();

 

posted @ 2024-05-30 15:48  成信吴彦祖(略胜亿筹)  阅读(64)  评论(0)    收藏  举报