Qt完美实现360安全卫士主界面标题栏

作者:小菜 更新时间:2025-02-26 点击数:
简介:这篇博文主要讲解360安全卫士标题栏的创建。

关于标题栏,我想大家应该都非常熟悉了,其主要包括窗口关闭、最大化/还原、最小化等按钮;但是标题栏的这些按钮都是非常有

【菜科解读】

这篇博文主要讲解360安全卫士标题栏的创建。

关于标题栏,我想大家应该都非常熟悉了,其主要包括窗口关闭、最大化/还原、最小化等按钮;但是标题栏的这些按钮都是非常有特色的。

在我写这篇博文之前,我就已经完成了类似360安全卫士标题栏的创建代码,在开始写代码时,我仔细想了想360安全卫士主界面标题栏的构建方法,它是自绘的还是贴图的?所以我特意在360论坛查了查它皮肤制作的方法,并在它的安装目录下的找到了这些按钮的特定图片(皮肤文件解压),即由贴图来做的。

既然知道了构建方法,那么就用代码实现即可,我实现的效果图如下(初始界面是这样,标题栏的其他效果和360安全卫士的标题栏效果一样):

标题栏也是自定义的部件(继承于QWidget),在这个自定义的部件里,你想实现啥功能都可以。

一、部件构建

部件构建当然是创建子部件,设置子部件样式,给标题栏设置布局管理等,这些也都是很基础的。

标题栏由三个QLabel和五个QToolButton组成,这五个QToolButton即为标题栏最右边的五个功能按钮,首先当然是创建这些子部件了。

//创建子部件void TitleBar::CreateWidget() //图像标签--logo m_pLabelIcon = new QLabel(this); QPixmap objPixmap(":/image/360AboutLogo.png"); m_pLabelIcon->setPixmap(objPixmap.scaled(TITLE_H,TITLE_H)); //文本标签--标题 m_pLabelTitle = new QLabel(this); m_pLabelTitle->setText(QString("360 Safe Guard V8.5")); //文本标签--样式版本 m_pLabelVersion = new QLabel(this); m_pLabelVersion->setText(QString("Use Class Style")); //设置鼠标形状 m_pLabelVersion->setCursor(Qt::PointingHandCursor); //按钮--更换皮肤 m_pBtnSkin = new QToolButton(this); //设置初始图片 SetBtnIcon(m_pBtnSkin,eBtnStateDefault,true); //按钮--菜单 m_pBtnMenu = new QToolButton(this); SetBtnIcon(m_pBtnMenu,eBtnStateDefault,true); //按钮--最小化 m_pBtnMin = new QToolButton(this); SetBtnIcon(m_pBtnMin,eBtnStateDefault,true); //按钮--最大化/还原 m_pBtnMax = new QToolButton(this); SetBtnIcon(m_pBtnMax,eBtnStateDefault,true); //按钮--关闭 m_pBtnClose = new QToolButton(this); SetBtnIcon(m_pBtnClose,eBtnStateDefault,true); //获得子部件 const QObjectList &objList = children(); for(int nIndex=0; nIndexsetMouseTracking(true); //如果是QToolButton部件 if(0==qstrcmp(objList.at(nIndex)->metaObject()->className(),"QToolButton")) //连接pressed信号为slot_btnpress connect(((QToolButton*)(objList.at(nIndex))),SIGNAL(pressed()),this,SLOT(slot_btnpress())); //连接clicked信号为slot_btnclick connect(((QToolButton*)(objList.at(nIndex))),SIGNAL(clicked()),this,SLOT(slot_btnclick())); //设置顶部间距 ((QToolButton*)(objList.at(nIndex)))->setContentsMargins(0,VALUE_DIS,0,0);}

子部件创建完之后,就要设置这些子部件的基本样式了,我使用qss样式表对其进行样式设置,当然还有其他方法。

View Code

//设置子部件样式(qss)void TitleBar::SetWidgetStyle() //设置标签的文本颜色,大小等以及按钮的边框 setStyleSheet("QLabel{color:#CCCCCC;font-size:12px;font-weight:bold;}QToolButton{border:0px;}"); //设置左边距 m_pLabelTitle->setStyleSheet("margin-left:6px;"); //设置右边距以及鼠标移上去时的文本颜色 m_pLabelVersion->setStyleSheet("QLabel{margin-right:10px;}QLabel:hover{color:#00AA00;}");}

最后就是创建布局管理器,把这些子部件加入到布局管理器中,我使用水平布局管理器,如下代码所示:

View Code

//创建设置布局void TitleBar::CreateLayout() //水平布局 m_pLayout = new QHBoxLayout(this); //添加部件 m_pLayout->addWidget(m_pLabelIcon); m_pLayout->addWidget(m_pLabelTitle); //添加伸缩项 m_pLayout->addStretch(1); //添加部件 m_pLayout->addWidget(m_pLabelVersion); m_pLayout->addWidget(m_pBtnSkin); m_pLayout->addWidget(m_pBtnMenu); m_pLayout->addWidget(m_pBtnMin); m_pLayout->addWidget(m_pBtnMax); m_pLayout->addWidget(m_pBtnClose); //设置Margin m_pLayout->setContentsMargins(0,0,VALUE_DIS,0); //设置部件之间的space m_pLayout->setSpacing(0); setLayout(m_pLayout);}

在这节中,设置按钮图片的函数为SetBtnIcon函数,该函数的原型如下所示:

View Code

void SetBtnIcon(QToolButton *pBtn,eBtnMoustState state,bool bInit=false);

其中pBtn代表被设置图片的按钮,而eBtnMoustState是一个枚举值,代表该按钮当前的状态,枚举定义如下所示:

View Code

//枚举,按钮状态enum eBtnMoustState{ eBtnStateNone,//无效 eBtnStateDefault,//默认值(如按钮初始显示) eBtnStateHover,//鼠标移到按钮上状态 eBtnStatePress//鼠标按下按钮时状态 };

而bInit表示是否是初始化设置,因为在SetBtnIcon函数里需要获得主界面最大化标志值,而这时候主界面窗口构造函数还没完成,同时在SetBtnIcon函数里又需要获得主界面窗口对象,因此会矛盾,所以使用了bInit标志值进行区分。

SetBtnIcon函数的定义如下代码所示:

View Code

//设置按钮不同状态下的图标void TitleBar::SetBtnIcon(QToolButton *pBtn,eBtnMoustState state,bool bInit/*=false*/) //获得图片路径 QString strImagePath = GetBtnImagePath(pBtn,bInit); //创建QPixmap对象 QPixmap objPixmap(strImagePath); //得到图像宽和高 int nPixWidth = objPixmap.width(); int nPixHeight = objPixmap.height(); //如果状态不是无效值 if(state!=eBtnStateNone) /*设置按钮图片 按钮的图片是连续在一起的,如前1/4部分表示默认状态下的图片部分,接后的1/4部分表示鼠标移到按钮状态下的图片部分 pBtn->setIcon(objPixmap.copy((nPixWidth/4)*(state-1),0,nPixWidth/4,nPixHeight)); //设置按钮图片大小 pBtn->setIconSize(QSize(nPixWidth/4,nPixHeight));}

View Code

//获得图片路径(固定值)const QString TitleBar::GetBtnImagePath(QToolButton *pBtn,bool bInit/*=false*/) QString strImagePath; //皮肤按钮 if(m_pBtnSkin==pBtn) strImagePath = ":/image/SkinButtom.png"; //菜单按钮 if(m_pBtnMenu==pBtn) strImagePath = ":/image/title_bar_menu.png"; //最小化 if(m_pBtnMin==pBtn) strImagePath = ":/image/sys_button_min.png"; //最大化/还原按钮,所以包括最大化和还原两张图片 if(m_pBtnMax==pBtn) //如果是初始设置或者主界面的最大化标志不为真(其中MainWindow::Instance()使用单例设计模式) if(bInit==true || MainWindow::Instance()->GetMaxWin()==false) //最大化按钮图片路径 strImagePath = ":/image/sys_button_max.png"; else //还原按钮图片路径 strImagePath = ":/image/sys_button_restore.png"; //关闭按钮 if(m_pBtnClose==pBtn) strImagePath = ":/image/sys_button_close.png"; return strImagePath;}

二、设置按钮其他效果

各位在使用360安全卫士的时候,把鼠标移到关闭按钮上或者使用鼠标按下关闭按钮,其呈现不同的图片以示区分,当然其他按钮也一样。

那么是不是也和工具栏按钮一样,子类化一个按钮了?不需要。

使用事件过滤器,在标题栏部件中进行事件判断和目标判断即可。

首先是创建事件过滤器,代码如下所示:

View Code

//创建事件过滤器void TitleBar::CreateEventFiter() m_pBtnSkin->installEventFilter(this); m_pBtnMenu->installEventFilter(this); m_pBtnMin->installEventFilter(this); m_pBtnMax->installEventFilter(this); m_pBtnClose->installEventFilter(this);}

然后在标题栏部件中重写eventFilter函数即可,代码如下:

View Code

//事件过滤bool TitleBar::eventFilter(QObject *obj, QEvent *event) //按钮状态 eBtnMoustState eState = eBtnStateNone; //判断事件类型--QEvent::Enter if (event->type() == QEvent::Enter) eState = eBtnStateHover; //判断事件类型--QEvent::Leave if (event->type() == QEvent::Leave) eState = eBtnStateDefault; //判断事件类型--QEvent::MouseButtonPress if (event->type() == QEvent::MouseButtonPress && ((QMouseEvent*)(event))->button()== Qt::LeftButton) eState = eBtnStatePress; //判断目标 if(m_pBtnSkin==obj || m_pBtnMenu==obj || m_pBtnMin==obj || m_pBtnMax==obj || m_pBtnClose==obj) //如果状态有效 if(eState != eBtnStateNone) //根据状态设置按钮图标 SetBtnIcon((QToolButton *)obj,eState); return false; return QWidget::eventFilter(obj,event);}

即根据事件类型设置按钮状态;最后在各个按钮的click槽函数中实现相应功能即可,如窗口关闭,最大化等。

View Code

//槽函数--slot_btnclickvoid TitleBar::slot_btnclick() QToolButton *pBtn = (QToolButton*)(sender()); if(pBtn==m_pBtnMin) emit signal_min(); if(pBtn==m_pBtnMax) emit signal_maxrestore(); if(pBtn==m_pBtnClose) emit signal_close();}

上述代码实现是发送自定义信号;状态栏部分由于很简单就不描述了。

完美,实现,360,安全,卫士,主,界面,标题栏,这篇,

周围完好无损,自己已成灰烬?令人惊奇的“人体自燃”现象

人体不与外界火源接触,内部燃烧变为灰烬,灰烬周围所有可燃物体保持完整的现象称为自燃。

到目前为止,世界上已有220多例人类自燃,其中最小的4个月大,最大的114岁。

这些事件都发生在平常生活中,甚至是在走路、开车、跳舞和洗澡时,几乎是不可预测的。

在1673年,意大利一个躺在草床上的人莫名其妙地变成了灰烬,但草床和周围的物体完好无损。

1938年9月,在英格兰利物浦的一个舞厅里,一个女孩突然尖叫着。

众人看到一团火焰从的身体里突然出现,她的整个身体突然变成了一团火球。

众目睽睽之下,女子被活活烧死。

经过调查,女孩本人和周围环境没有任何可能引起火灾的因素。

来验尸的法医目瞪口呆。

他说:“在我漫长的职业生涯中,我从来没有遇到过这样莫名其妙的事情!”接着,1951年7月初,在美国佛罗里达州,一名男子发现他的母亲玛丽夫人奥秘地失踪了。

他回忆说,昨天夜晚他的母亲舒适地坐在椅子上休息,但今天他发现他的母亲和椅子不见了。

然而,在地上,有几个烧焦和变形的发夹,几块烤制的脊椎骨和一个头骨缩小成棒球大小,还有一只很好的左脚。

然而,离骨头很近的报纸和几英寸远的一块亚麻布完好无损。

1966年12月,在美国宾夕法尼亚州港口城,一名煤气工人在Bentley博士的房子的地下室发现了一堆灰烬,在灰烬上方的天花板上发现了一个大的燃烧洞。

他没有在整个房间里找到老博士,但在浴室里,他看到地板上有一条半个人的腿。

老人的身体已经化为灰烬,但整个场景中没有火的迹象。

1990年8月,在比利时布鲁塞尔,一对年轻夫妇在路上接吻时突然背上着火。

火焰上升到15英尺。

过了一会儿,两人变成了路边的一堆烧焦的灰烬。

在同一个月,法国巴黎圣玛丽大学的一个女孩Maas在澡堂洗澡时,浓烟从她的身体里冒出来。

为何会出现这些自燃现象? 科学界有不同的看法。

有些人认为这些是虚假的报道;有些人认为某种天然的“电流体”导致体内可燃物质燃烧,他们无法解释什么是“电流体。

此外,还有几项基于科学的说法:1. 物质反应理论。

英国化学家菲利普教授对这些人类自燃现象进行了深入的调查。

调查发现,受害者大多是25至30岁的妇女,他们经常是穿着厚衣服的人。

自燃的真相可能是人体的汗液,分泌物,尿液等水分和衣服中的化学物质发生化学反应,产生一定效果的摩擦引起火灾引起人体灼伤。

但这并不能完全解释自燃悲剧。

由于这些自燃事件,发生的时间很可能发生在全年,有些时候没有出汗,有些穿着很少,甚至可以发生在裸体淋浴,所以这一观点不能令人信服2. 人体静电放电。

这一

老人离世前的8种状态,终于有人说清楚了,看完受益匪浅。

" src="http://www.cai58t.com/tansuo/weijiezhimi/https:/p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/e588f477da864199abf0d1f4ec319b51~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1706589419&x-signature=OcVmoSHCJUU6NDTMqqxNSjlC8nU%3D">描述:老人离世前的状态一直是一个备受争议的话题。

很多人对此感到困惑,不知道老人在临终前会经历什么。

今天,我将为大家揭开这个神奇的面纱,详细介绍老人离世前的8种状态。

无论你是成年人还是孩子,阅读本文都能帮助你更好地理解老人的心理和身体变化,以及怎么更好地陪伴老人度过最终的时光。

请继续阅读,你将从中受益匪浅!" src="http://www.cai58t.com/tansuo/weijiezhimi/https:/p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/ac507f13cab142beb034ca470a45693b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1706589419&x-signature=J4r0TtGCmY8id6MW2s%2BzuIsy3xQ%3D">正文:众所周知,随着年龄的增长,老人的身体和心理状况都会发生一些变化。

当他们进入晚年之际,这些变化可能会更加明显。

以下是老人离世前的八种状态,让我们一起来了解一下吧。

1. 生命回顾 Life Review就像满载回忆的电影一样,老人在离世前常常会回顾他们一生中的主要时刻和人物。

这个过程不仅可以帮助他们整理过去的经历,还可以使他们更好地接受生命的终结。

2. 社交淡化 Social Withdrawal老人离世前可能逐渐减少社交活动,更倾向于独处。

这是因为他们开始将注意力集中在自己内心的思考和感受上,更加专注于内在的平静与安宁。

3. 心灵预备 Spiritual Preparation随着离世的临近,老人可能会更加关注精神层面的准备工作。

他们可能会寻求宗教信仰的慰藉,进行心灵的净化,以平静地迎接死亡的到来。

4. 物质舍弃 Material Surrender老人在离世前通常会放下对物质的执着,不再追求名利和功成名就。

他们可能会将自己的财产和事务安排妥当,以确保亲人们能够顺利继承。

5. 身体衰弱 Physical Decline老年人的身体机能逐渐衰退是不可幸免的现象。

他们可能会感到疲惫、乏力,身体各个系统也会出现不同程度的衰退。

这时,身体的痛苦和不适可能会加剧。

6. 意识变化 Consciousness Shift在离世的过程中,老人可能会进入一种特殊的意识状态。

有些人会感到超乎寻常的清晰与平静,体验到一种与现实世界脱离的感觉。

这给了他们机会与内在的自我进行对话与沟通。

7. 家人陪伴 Family Reconciliation对于一些老人来说,离世前的状态还包括与家人之间的和解与团聚。

他们可能会主动寻求与亲人们修复关系,表达自己的爱与感激之情,并共同度过宝贵的时光。

8. 接受与平静 Acceptance and Serenity最终,在离世前,许多老人会逐渐接受死亡的到来,感受到一种内心的平静和宁静。

他们可能会明白生老病死是生命循环的一部分,从而以一种平和的态度面对生命的结束。

以上就是老人离世前的八种状态。

希望通过本文的介绍,能够让大家更好地理解和关心老人,在他们最终的时光里给予他们温暖和陪伴。

让我们共同努力,制造一个关爱与尊重老人的社会环境!感谢您的阅读!如果本文对您有所启发或帮助,请不吝点赞、评论和分享。

也欢迎关注我的头条编辑,了解更多有关处于良好的状态、心理和人文的精彩内容。

祝愿大家身体处于良好的状态,幸福安康!

加入收藏
               

Qt完美实现360安全卫士主界面标题栏

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录