Qt黑科技

作者: 猿基地 | 来源:发表于2015-06-29 16:52 被阅读610次

不能继承于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问题你一辈子都遇不上,但是一旦遇上会让你抓狂。我分享这些的经验不仅仅是为了解决某些特定的问题,更是为了给你提供一些解决的思路。

相关文章

  • Qt黑科技

    不能继承于QObject的类就一定不能使用信号槽? 首先不能继承QObject的情况在开发中遇到得并不多,笔者在一...

  • Qt简介

    徐红伟@百香果科技 Qt历史 1991:在挪威开始开发; 1994年:Trolltech(Qt Company)成...

  • 端银x八正道|21天百万实操信用卡特训营 130号蓝精灵第6次作

    这次课程,老师给我们讲解了关于征信的黑科技,信用卡申请的黑科技,曲线提额的黑科技,贷款类的黑科技,境外综合评分的黑...

  • QObject类

    徐红伟@百香果科技 QObject类是所有Qt对象的基类。是Qt对象模型的基础。 Signals和Slots机制 ...

  • 黑科技

    《黑科技》| 丁雨解读 关于作者 本书由15位作者联袂写成,其中包括了亚马逊软件工程师、苹果“下一代输入技术”硬件...

  • 黑科技

  • 黑科技~

    原来非洲才是最先进的..........

  • 黑科技

    取消禁用复制 document.oncontextmenu=document.onselectstart=docu...

  • 黑科技

    1. 体外骨骼,动力机甲,明日边缘 2. 磁力魔法,悬磁浮 3. 虚拟现实,VR 4. 智能微尘,物联网 5. 三...

  • 黑科技

    《黑科技》| 丁雨解读 关于作者 本书由15位作者联袂写成,其中包括了亚马逊软件工程师、苹果“下一代输入技术”硬件...

网友评论

    本文标题:Qt黑科技

    本文链接:https://www.haomeiwen.com/subject/zaieqttx.html