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

 

posted @ 2024-12-02 19:42  耿明岩  阅读(40)  评论(0编辑  收藏  举报
希望能帮助到你,顺利解决问题! ...G(^_−)☆