Qt nativeEvent 不触发/不执行/无效
在做触摸屏项目的时候,各种控件都需要实现监听/触发点击事件,通常是通过信号/槽、事件过滤器(eventFilter)、重写mousePressEvent。
发现在QSpinBox中点击编辑框时不会触发任何鼠标相关点击事件。
查资料发现通过重写nativeEvent函数可以拿到鼠标相关事件,不过有一个坑需要注意,需要显示调一下this->winId() nativeEvent才能正常触发!
class Q_DECL_EXPORT QSpinBoxDemo : public QSpinBox { Q_OBJECT public: QSpinBoxDemo(QWidget *wid); bool nativeEvent(const QByteArray &eventType, void *message, long *result) override; };
QSpinBoxDemo::QSpinBoxDemo(QWidget* wid):QSpinBox(wid) { setFocusPolicy(Qt::ClickFocus); this->winId();//必须,不然nativeEvent不触发 } bool QSpinBoxDemo::nativeEvent(const QByteArray &eventType, void *message, long *result) { Q_UNUSED(eventType); MSG *msg = static_cast<MSG *>(message); // qDebug() << msg->message; // 检测鼠标按下和松开事件 if (msg->message == WM_LBUTTONDOWN) { qDebug() << "Mouse Button Pressed at: (" << msg->pt.x << ", " << msg->pt.y << ")"; } if(msg->message == WM_LBUTTONUP) { this->clearFocus();//清除焦点,防止选中数字时不触发事件 } return QSpinBox::nativeEvent(eventType, message, result); }
感谢知乎中某个大佬的合理解释为什么必须调winId()后才会正常触发nativeEvent:
(99+ 封私信 / 80 条消息) 为什么 QT 的控件句柄只有用了 winId() 才能被捕捉到? - 知乎
分类:
C/C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2022-12-02 Qt 记录update长时间频繁刷新后界面卡死问题
2021-12-02 HC-05 TTL调试 进入AT模式,EN针脚置高电平
2021-12-02 记录opencv编译后只有openncv_world、opencv_ts,没有opencv_corexxx(版本号)、opencv_dnn等相关库 BUILD_opencv_world