继承QToolButon实现Qt自定义按钮遇到的事件问题
2012-04-19 14:01
399 查看
目的:
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函数中接收到的事件数量和类型却如此不同。
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函数中接收到的事件数量和类型却如此不同。
相关文章推荐
- QT 学习中遇到的问题~~~~常见的信号处理机制(on_browseButton_clicked()) (toLower) (separator()) (setText)
- Android进阶——自定义View之继承系统控件实现自带删除按钮动画效果和软键盘自动悬浮于文本框下方
- 自定义返回按钮时,iOS7手势返回遇到的问题
- Qt实现透明无边框,无关闭按钮,带自定义图片的窗体实例代码
- Qt5开发自定义控件中遇到的问题
- Qt实现自定义按钮的三态效果
- Qt5中创建及使用自定义插件遇到的一些问题
- iOS微信支持遇到的问题:只显示一个确定按钮、onResp不回调、闪回
- 自定义View想使用Scroller实现滑动效果,但是事件接收出现问题,只收到ACTION_DOWN,而无法收到ACTION_MOVE, ACTION_UP等消息的处理
- Qt实现自定义按钮的三态效果
- 嵌入式 QT code :-10737418以及自定义鼠标和键盘事件和图片问题
- iOS11 自定义tabbar遇到的问题,删除系统自带tabbar按钮
- IOS之UI--自定义按钮实现代理监听点击事件
- Qt5开发自定义控件中遇到的问题
- 自定义封装导航栏左右按钮点击事件和特定风格的控制器供多个控制器继承—— 当很多导航页面有相似的导航条时
- Qt实现自定义按钮的三态效果(转载自http://www.cnblogs.com/emouse/archive/2013/07/14/3189319.html)
- 再谈Qt实现Rasdial拨号问题(说说项目中遇到的问题和解决方案)
- QT 实现屏幕共享,遇到udp掉包的问题
- 自定义ListView item包含checkbox实现单选记录自己开发是遇到的问题
- 在用zepto的on事件中遇到的一个奇怪问题.