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();

浙公网安备 33010602011771号