项目场景:
基于Qt C++ 开发鼠标点击spinbox的触发任务时,我基于QSpinBox继承开发了一个新类,用于弹出自定义键盘。
问题描述
在鼠标点击spinbox的边框以及上下键的时候,能够触发覆写的mousePressEvent,但是一旦鼠标点击了spinbox的内部,就不会触发。这就没法正常弹出我想要打开的键盘。
@Overridevoid mousePressEvent(QMouseEvent* event) override {// 当用户点击InputSpinBox时显示弹出窗口 popupDialog.showFloatingDialog();QSpinBox::mousePressEvent(event);}
原因分析:
经过分析,这是因为QSpinBox和QDoubleSpinBox在Qt中触发事件时,点击到输入框内部的触发是执行在他们的子控件QLineEdit上的,导致QSpinBox和QDoubleSpinBox无法获取到点击事件。
解决方案:
试错的过程就不说了,直接说结论,需要强行调用他们的子控件QLineEdit去响应事件。
主继承构造函数中增加事件过滤器
QLineEdit* get_line_edit = findChild<QLineEdit*>();if (get_line_edit) {get_line_edit->installEventFilter(this);}
继承的类创建时,覆写时间函数,截取QLineEdit得触发事件
protected:bool eventFilter(QObject* obj, QEvent* event) override {if (obj->isWidgetType() && qobject_cast<QLineEdit*>(obj)) {QLineEdit* lineEdit = qobject_cast<QLineEdit*>(obj);if (event->type() == QEvent::MouseButtonPress) {// 用户点击了 QLineEditclicked_input_area();// 你可以在这里连接一个自定义信号,或者执行其他操作}}// 对于其他事件或对象,继续默认的事件处理return QSpinBox::eventFilter(obj, event);}