这篇博文主要讲述360安全卫士工具栏的建立;工具栏由图片和文字组成,当鼠标移到工具栏按钮上时,须要有些特征表达该现象,如背景色变化等;固然鼠标单击工具栏按钮时,一样也要有些特征,而且这个特征区别于鼠标移到按钮上的特征;写起来有些拗口,我给你们先看看我实现的效果图。html
单击按钮时和鼠标移到按钮上时,按钮背景会不一样,而且单击其余按钮时,已单击的那个按钮背景应该恢复。下面讲解其具体实现。安全
1、工具栏的建立app
工具栏固然是自定义的部件了(继承于QWidget),工具栏上的那些按钮都是继承于QToolButton;其中有9个按钮,最右边的是label;工具栏类的成员变量以下所示:ide
首先固然是建立这些子部件了,和通常的没啥区别:函数
工具栏里的按钮和label都是手动定位(即设置位置信息),因此重写了resizeEvent事件,在resizeEvent事件里进行部件定位,以下所示:工具
你们可能会想:在resizeEvent事件里只对label进行定位了,那其余9个按钮了?由于其余9个按钮都是从最左边(也就是0)计算相对位移,而label是从最右边计算的,经过rect()函数得到工具栏的最右边位置信息;按钮在建立部件函数的时候就定位了位置,若是label也在那个时候定位位置的话是错误的,由于那是工具栏部件的大小是未知的,因此rect()函数返回的值也是未知的;当放在resizeEvent事件中进行处理时,工具栏部件显示出来的时候,其大小都是能够肯定的。字体
2、工具栏按钮效果设置spa
工具栏按钮继承于QToolButton;首先是设置按钮的基本显示效果了,去掉Qt自带的效果;包括文本颜色,文本字体,样式大小等,这些在我前几篇的博文中有讲解;代码以下所示:指针
OK,按钮的基本效果就出来了,按钮是透明的,只显示图片和文本,没背景信息。
再一步就是设置鼠标移到按钮上的效果了,鼠标移到按钮上时,背景呈现立体的半透明效果;当鼠标移上去时,设置移动标志(m_bOver)为ture,当鼠标离开按钮时,设置移动标志为false;而后各自update发出重绘事件请求便可。code
在重绘事件里会对bOver进行判断来绘制鼠标移到按钮上的效果,后面讲解到重绘时再细节描述。
而后就是鼠标单击按钮时的效果了,和鼠标移到按钮上的实现原理基本同样;不过只是在槽函数中而不是由事件触发了;信号和槽函数在构造函数中已经被链接上了,槽函数以下:
其中SetPress函数即设置按下标志(m_bPress)而后发送重绘请求。
其中slot_pressed槽函数中发送了一个自定义信号signal_parent,在工具栏部件中会对该信号进行链接,其中信号的参数为按钮对象的指针。工具栏部件链接该信号的槽函数为slot_set函数:
整体意思是:例若有A,B,C三个按钮在工具栏中,若是按下了A按钮,这是按下B按钮时,发送信号给工具栏,而后在工具栏对应的槽函数中进行指针值对比,若是不是B按钮,就调用其余对应按钮的SetPress函数,并设置为false,这样A按钮就没有按下去的背景效果了(排他性)。
3、工具栏按钮效果绘制
绘制固然要在按钮的paintEvent事件处理函数中实现了,代码以下所示,代码注释的很详细,我就很少说了:
OK,这篇博文就写完了,下一篇博文主要讲解标题栏和状态栏的构建了。
本文来源:http://www.cnblogs.com/appsucc/archive/2012/03/26/2417267.html