Qt黑科技
不能继承于QObject的类就一定不能使用信号槽?
首先不能继承QObject的情况在开发中遇到得并不多,笔者在一年多的Qt项目开发中只遇到两三次。而且都是因为引进了第三方库导致编译过程中报错。
要想解决这个问题其实不难,因为笔者遇到的问题都是想定义一个信号,定义的槽情况没有遇到过,可以提出一个想法,有需要的朋友试一下。
要想实现信号发送,可以定义一个信号发射器类继承于QObject,然后在想要发送信息的类里定义一个信号发射器:
图1 图2只要在想触发信号的地方调用信号发射器的sendMsg()函数就可以让信号发射器将信号发出。
要想实现槽的话,可以同处理信号的方式解决,建立一个信号处理器,将要处理的内容传入其中即可。
另外还想啰嗦几句,虽然这个方法是笔者为了解决某些类不能继承于QObject想到的,但是不只限于解决这一种情形。
在一次项目中,遇到一个问题:很多个(自动添加的)控件,点击某个控件就将其自带的信息显示在一个文本框中,我解决的方案就是将一个信号处理器使用单例模式编写,在控件的基类中的clicked()响应的槽函数中去调用sendMsg()实现的。
Qt浮动按钮的实现
效果如下:
图3估计很多做Qt有一定经验的朋友会觉得这个效果不难,但是这是一个需求奇葩的实际业务中做出的效果。笔者会想讲下客户的需求和整体框架的矛盾。
整个项目主要是由Qt搭建的,图上的地图是JavaScript实现的。显然要实现这个效果在地图控件中去实现在结构上会更加合理,但是这些按钮的功能是需要打开对应的QWidget,如果是在地图控件中实现会让这个公司长期维护的地图控件嵌入业务相关的代码,这是不合理的。如果是在Qt这里实现,因为地图控件是嵌入在一个QWidget中,所以在QWidget上做出不属于gaiQWidget的浮动按钮才是真正的挑战。
图4将所有按钮放入一个QWidget中,在QWidget中利用这两行代码就可以实现出一组浮动的按钮,但是位置还不对。
然后是在你这组浮动按钮的父窗口中实现以下事件响应:
图5moveEvent是为了让浮动按钮跟随父窗口移动,hideEvent是跟随父窗口隐藏,为什么笔者还要实现showEvent、paintEvent这是因为在show的过程中,浮动按钮会先于父窗口恢复,给人以很怪异的感觉,所以在showEvent中将m_bISToolWidgetShow赋值为真,在接下来的PaintEvent中让浮动按钮晚一点显示,再将m_bISToolWidgetShow赋值为假,如果不是因为show进的paintEvent就不需要这个处理。
总结:也许笔者这些利用黑科技解决的Qt问题你一辈子都遇不上,但是一旦遇上会让你抓狂。我分享这些的经验不仅仅是为了解决某些特定的问题,更是为了给你提供一些解决的思路。
�