Qt之实现360安全卫士主界面(三)
2012-03-26 11:37:43 来源:WEB开发网
单击按钮时和鼠标移到按钮上时,按钮背景会不同,并且单击其他按钮时,已单击的那个按钮背景应该恢复。下面讲解其具体实现。
一、工具栏的创建
工具栏当然是自定义的部件了(继承于QWidget),工具栏上的那些按钮都是继承于QToolButton;其中有9个按钮,最右边的是label;工具栏类的成员变量如下所示:
View Code
QList<MyBtn*> m_listMyBtnPoint;//自定义按钮
QList<QString> m_listMyStr;//按钮对应的文本
QLabel *m_pLabel;//label,显示logo
首先当然是创建这些子部件了,和一般的没啥区别:
View Code
//CreateWidget创建部件
void ToolBar::CreateWidget()
{
//文本例子
m_listMyStr<<"Examine"<<"KillTrojan"<<"CleanDust"<<"LeakRepair"<<"SysRepair"
<<"CleanCom"<<"FunFull"<<"SoftMan"<<"OptSpeed";
//创建toolbutton
for(int nIndex = 0;nIndex<WIDGET_CNT;++nIndex)
{
//图像资源路径
QString strImage = QString(":/image/%1.png").arg(nIndex+1);
//创建自定义QToolButton(MyBtn)
m_listMyBtnPoint.append(new MyBtn(strImage,m_listMyStr[nIndex],this));
//设置toolbutton的位置
m_listMyBtnPoint.at(nIndex)->move(nIndex*TOOLWIDGET_H+VALUE_DIS,0);
//该信号槽设置其他按钮的按下状态bool值
connect(m_listMyBtnPoint.at(nIndex),SIGNAL(signal_parent(void*)),this,SLOT(slot_set(void*)));
}
//创建label
m_pLabel = new QLabel(this);
m_pLabel->setPixmap(QPixmap(":/image/logo.png"));
}
工具栏里的按钮和label都是手动定位(即设置位置信息),所以重写了resizeEvent事件,在resizeEvent事件里进行部件定位,如下所示:
View Code
//resizeEvent
void ToolBar::resizeEvent (QResizeEvent * event)
{
//按钮垂直居中
m_pLabel->move(rect().width()-m_pLabel->pixmap()->width()-VALUE_DIS,(rect().height()-m_pLabel->pixmap()->height())/2);
}
大家可能会想:在resizeEvent事件里只对label进行定位了,那其他9个按钮了?因为其他9个按钮都是从最左边(也就是0)计算相对位移,而label是从最右边计算的,通过rect()函数获得工具栏的最右边位置信息;按钮在创建部件函数的时候就定位了位置,如果label也在那个时候定位位置的话是错误的,因为那是工具栏部件的大小是未知的,所以rect()函数返回的值也是未知的;当放在resizeEvent事件中进行处理时,工具栏部件显示出来的时候,其大小都是可以确定的。
更多精彩
赞助商链接