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() 才能被捕捉到? - 知乎