在做触摸屏项目的时候,各种控件都需要实现监听/触发点击事件,通常是通过信号/槽、事件过滤器(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() 才能被捕捉到? - 知乎