继承QToolButon实现Qt自定义按钮遇到的事件问题

目的:

QToolButton的clicked()信号只能连接到某个槽函数,当用户动态配置添加一个或者多个按钮到主界面的QToolBar,并且每个按钮被点击后执行不同的行为时,clicked()信号显然就无法满足需求了,因为你不知道是哪个QToolButton被点击了。


实现方式:

自定义按钮继承自QToolButton,重新实现void QWidget::mouseReleaseEvent(QMouseEvent *e)函数,用户通过配置按钮对话框配置自定义按钮,提交后将参数传递给自定义按钮来构造或者设置自定义按钮对象的相关属性,在mouseReleaseEvent()函数中根据属性来执行不同的动作。


期间遇到的问题:
由于QToolBar上一般添加QAction,最开始是继承QAction类实现自定义按钮,最后发现QAction只有一个继承自QObject的bool event(QEvent *e)函数,重新实现此函数,通过打印此函数接收到的消息,发现只产生QEvent::ActionChanged事件,此事件是向QToolBar中添加自定义按钮产生,而其他事件却没有产生,如果直接将此自定义按钮的triggered()事件连接到槽函数,点击按钮,槽函数却可以执行。从我的理解,按钮事件应该首先被event函数捕获,由此函数处理事件并决定是否转发事件给父对象处理,但是从现象来看并非如此,可能是因为QAction不是继承自QWidget导致,经过测试,自定义按钮如果继承自QToolButton(从QWidget继承),重新实现的event函数可以正常接收普通事件了,没有前面的问题;

后来继承QToolButton实现自定义按钮,重新实现void QWidget::mouseReleaseEvent(QMouseEvent *e)函数和QObject的bool event(QEvent *e)后,按钮不能正常显示,发现event函数中没有执行return QToolButton::event(e),导致event接收到的事件都被截获,而没有转发给父对象,导致父对象接收不到重绘事件,按钮也就无法显示。

另外,重新实现的mouseReleaseEvent()函数中,需要执行QToolButton::mouseReleaseEvent(e),以告知父对象以默认方式处理此事件,否则按钮在release后无法恢复。

无法理解,为什么分别继承自QAction和QToolButton的自定义控件,他们的event函数都是重新实现了QObject的,但在event函数中接收到的事件数量和类型却如此不同。



你可能感兴趣的:(继承QToolButon实现Qt自定义按钮遇到的事件问题)