Qt黑科技

不能继承于QObject的类就一定不能使用信号槽?

首先不能继承QObject的情况在开发中遇到得并不多,笔者在一年多的Qt项目开发中只遇到两三次。而且都是因为引进了第三方库导致编译过程中报错。

要想解决这个问题其实不难,因为笔者遇到的问题都是想定义一个信号,定义的槽情况没有遇到过,可以提出一个想法,有需要的朋友试一下。

要想实现信号发送,可以定义一个信号发射器类继承于QObject,然后在想要发送信息的类里定义一个信号发射器:

图1
图2


只要在想触发信号的地方调用信号发射器的sendMsg()函数就可以让信号发射器将信号发出。

要想实现槽的话,可以同处理信号的方式解决,建立一个信号处理器,将要处理的内容传入其中即可。

另外还想啰嗦几句,虽然这个方法是笔者为了解决某些类不能继承于QObject想到的,但是不只限于解决这一种情形。

在一次项目中,遇到一个问题:很多个(自动添加的)控件,点击某个控件就将其自带的信息显示在一个文本框中,我解决的方案就是将一个信号处理器使用单例模式编写,在控件的基类中的clicked()响应的槽函数中去调用sendMsg()实现的。


Qt浮动按钮的实现

效果如下:

图3

估计很多做Qt有一定经验的朋友会觉得这个效果不难,但是这是一个需求奇葩的实际业务中做出的效果。笔者会想讲下客户的需求和整体框架的矛盾。

整个项目主要是由Qt搭建的,图上的地图是JavaScript实现的。显然要实现这个效果在地图控件中去实现在结构上会更加合理,但是这些按钮的功能是需要打开对应的QWidget,如果是在地图控件中实现会让这个公司长期维护的地图控件嵌入业务相关的代码,这是不合理的。如果是在Qt这里实现,因为地图控件是嵌入在一个QWidget中,所以在QWidget上做出不属于gaiQWidget的浮动按钮才是真正的挑战。

图4

将所有按钮放入一个QWidget中,在QWidget中利用这两行代码就可以实现出一组浮动的按钮,但是位置还不对。

然后是在你这组浮动按钮的父窗口中实现以下事件响应:

图5

moveEvent是为了让浮动按钮跟随父窗口移动,hideEvent是跟随父窗口隐藏,为什么笔者还要实现showEvent、paintEvent这是因为在show的过程中,浮动按钮会先于父窗口恢复,给人以很怪异的感觉,所以在showEvent中将m_bISToolWidgetShow赋值为真,在接下来的PaintEvent中让浮动按钮晚一点显示,再将m_bISToolWidgetShow赋值为假,如果不是因为show进的paintEvent就不需要这个处理。

总结:也许笔者这些利用黑科技解决的Qt问题你一辈子都遇不上,但是一旦遇上会让你抓狂。我分享这些的经验不仅仅是为了解决某些特定的问题,更是为了给你提供一些解决的思路。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,871评论 22 665
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,198评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,989评论 25 708
  • 画了冰淇淋杯,感觉没画好,总想着应该可以画的更好些,于是又画了一副,应该会有点进步吧。结果是有点惨不忍睹,食不下...
    水泉印阅读 269评论 3 1
  • 时光匆匆,白驹过隙。距中考过后已经两年零五个月了,由于中考不得意我进入了一所中职学校,在学校里我又浑浑噩噩的度过了...
    寂寞冷风阅读 329评论 0 1