Qt的状态栏类的一点改进想法

发布: 2011-08-31 21:20

Qt的状态栏类是QStatusBar,继承自QWidget,维护了一个比较容易用的状态栏组件。
但在实际使用中,却发现它提供的功能并不够用。例如,我希望能在状态栏的左侧永久显示一个组件,却发现不行,问题在于QStatusBar中放在左侧的组件属于其“临时状态组件”概念,如果有新消息,那么消息将会覆盖组件,不再显示。

今天仔细阅读了QStatusBar类的源代码,发现代码并不太难阅读。

先说一个这个类的实现方式,它使用一个QList存储添加到状态栏的物件,包括物件的状态和拉伸属性,状态为是否是永久物件,注意这里只是一个布尔值,两种状态。

对于非永久物件,QStatusBar实现把其放在状态栏的左侧,对于永久物件,把其放在状态栏的最右侧。

但是这里有一点问题,并不是把状态栏分为三部分,而是分为两部分,临时物件与状态消息共同使用左侧,永久物件使用右侧。也就是说放在左侧的物件无法永久显示。

对于左侧的临时状态区域,QStatusBar在显示消息时,动态计算出文本消息可使用的区域大小,包括永久物件区域左侧的所有问题。

如果需要永久显示左侧的物件,首先,需要修改计算文本消息显示区域的方法,把临时物件占用的空间空出来。其次,在状态栏重绘时,重绘左侧的临时物件区域的物件(后面实际测试时发现,只需要在重绘方法中使用widget的show方法即可)。

总结一下,以这种思路改进QStatusBar的要点,
从Qt源代码中拷贝出来qstatusbar.cpp,qstatusbar.h,放在任意项目中。
修改两个文件中的类名,并改为继承QStatusBar而不是原来的QWidget。
修改计算文本消息显示区域的方法,保留左侧物件绘制空间。
修改绘制方法,显示左侧物件,调用物件的 show()方法,让左侧物件一直显示。

这种方法的好处是保留原有API及语义不变,只在初始化时实现化该继承类,后续调用方法不变。

另外,要是把表示物件状态的变量改为三态类型,分别表示左侧永久物件,临时文本消息物件,右侧永久物件,这样才是真正的扩展QStatusBar类。
不过这样可能还需要定义一个枚举量表示三种状态。

KDE也实现了一个KStatusBar,功能更强些,但是好象只能支持多区域的文本消息显示。

等整理好后发个代码出来。


原文: http://qtchina.tk/?q=node/594

Powered by zexport