Qt完美实现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,安全,卫士,主,界面,标题栏,这篇,用Erlang实现快速排序算法
最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适 合于构建分布式,实时软并行计算系统。
使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。
进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。
使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。
Erlang运行时环境是一个虚拟机,有点像Java虚拟机,这样代码一经编译,同样可以随处运行。
它的运行时系统甚至允许代码在不被中断的情况下更新。
另外如果你需要更高效的话,字节代码也可以编译成本地代码运行。
Yaws: 一个Erlang写的服务器,据说并发能是apache的15倍排序算法的原理无需多说,直接上代码 1 -module(quicksort). 2 -export([start/1]). 3 4 %% 程序入口 5 %% List:用户输入的待排序的数值列表 6 start(List) -> 7 SortedList = calu(List), 8 io:format("sorted list:~w~n", [SortedList]). 9 10 %% 得到排序后的数值列表11 calu([Key|RestList]) ->12 {LittleList, GreatList} = calu_sort(Key, RestList, [], []),13 calu(LittleList) ++ [Key] ++ calu(GreatList);14 calu([]) ->15 [].16 17 %% 快速排序算法18 %% Key:列表中的第一个元素19 %% [Element|RestElements]:列表中的其它元素20 %% LittleList:小于等于Key的数值组成的列表21 %% GreatList:大于Key的数值组成的列表22 calu_sort(Key, [Element|RestElements], LittleList, GreatList) ->23 if24 Element =25 calu_sort(Key, RestElements, [Element] ++ LittleList, GreatList);26 Element > Key ->27 calu_sort(Key, RestElements, LittleList, [Element] ++ GreatList)28 end;29 calu_sort(_Key, [], LittleList, GreatList) ->30 {LittleList, GreatList}.注意事项:代码第一次运行的时候,结果怎么都不对,调试之后发现问题出在24行的Element =Key(变量)表达式,写成了Element =key(原子),由于Element是数值,key是原子,根据Erlang的排序规则,数值小于原子,所以结果不正确。
由于变量名必须以大写开始,需要按住shirt键输入,有时候不注意没按住shirt就变成了原子。
这种问题在其它编程语言中是很难出现的,对于静态类型语言,直接就给出未定义符号的编译错误,对于动态语言,不同类型的数据一般是不予比较的。
所以在Erlang编程中要万分小心,不要把变量名写成原子,否则会出现编译通过而运行时出现各种异常结果的情况。
用,Erlang,实现,快速,排序,算法,Erlang,是,
Win10录制神器,轻松实现高效录制
软件支持 在线重装、U盘制作、自定义重装 等多种模式。
简介:Win10录制神器,轻松实现高效录制在现代社会,录制视频已经成为了人们生活中不可或缺的一部分。
无论是教育、娱乐还是工作,录制视频都能起到重要的作用。
然而,很多人在录制视频时都会遇到各种各样的问题,比如录制质量不佳、操作繁琐等。
为了解决这些问题,我们需要一款高效的录制工具。
而Win10录制神器正是这样一款工具,它能够轻松实现高效录制,让你的录制过程更加顺利。
工具原料:系统版本:Windows 10品牌型号:任意电脑或手机品牌型号软件版本:最新版本的Win10录制神器正文:一、Win10录制神器的简单操作Win10录制神器的操作非常简单,即使是初学者也能够轻松上手。
首先,打开Win10录制神器软件,选择录制模式,比如全屏录制或窗口录制。
然后,点击开始录制按钮,即可开始录制你想要的内容。
录制完成后,点击停止录制按钮,保存录制文件即可。
通过这样简单的几步操作,你就能够轻松实现高效录制。
二、Win10录制神器的强大功能Win10录制神器不仅操作简单,还具有许多强大的功能。
首先,它支持多种录制模式,比如全屏录制、窗口录制、区域录制等,满足不同录制需求。
其次,它还支持音频录制,可以录制系统声音和麦克风声音,让你的录制更加完整。
此外,Win10录制神器还支持视频编辑功能,你可以对录制的视频进行剪辑、添加字幕等操作,让你的视频更加精彩。
这些强大的功能使得Win10录制神器成为了一款不可或缺的工具。
三、Win10录制神器的案例应用Win10录制神器在各个领域都有广泛的应用。
比如,在教育领域,老师可以使用Win10录制神器录制教学视频,方便学生远程学习。
在娱乐领域,主播可以使用Win10录制神器录制游戏视频,与粉丝分享游戏乐趣。
在工作领域,员工可以使用Win10录制神器录制会议视频,方便回顾和分享会议内容。
这些案例都充分展示了Win10录制神器的高效性和实用性。
总结:Win10录制神器是一款功能强大、操作简单的录制工具,能够轻松实现高效录制。
无论是教育、娱乐还是工作,Win10录制神器都能够帮助你解决录制过程中的各种问题,让你的录制更加顺利。
因此,我强烈推荐大家使用Win10录制神器,让录制变得更加轻松和高效。
标签: 注意:本站所刊载的文章均为学习交流之用,请勿用于商业用途。
对于商业使用,请联系各自版权所有者,否则法律问题自行承担。
Win7系统升级指南:全面解析升级步骤与要点 Win7系统损坏修复教程:详细步骤助你快速解决问题 Win10录制神器,轻松实现高效录制 分类于: 回答于:2023-11-03 简介:Win10录制神器,轻松实现高效录制在现代社会,录制视频已经成为了人们生活中不可或缺的一部分。
无论是教育、娱乐还是工作,录制视频都能起到重要的作用。
然而,很多人在录制视频时都会遇到各种各样的问题,比如录制质量不佳、操作繁琐等。
为了解决这些问题,我们需要一款高效的录制工具。
而Win10录制神器正是这样一款工具,它能够轻松实现高效录制,让你的录制过程更加顺利。
工具原料:系统版本:Windows 10品牌型号:任意电脑或手机品牌型号软件版本:最新版本的Win10录制神器正文:一、Win10录制神器的简单操作Win10录制神器的操作非常简单,即使是初学者也能够轻松上手。
首先,打开Win10录制神器软件,选择录制模式,比如全屏录制或窗口录制。
然后,点击开始录制按钮,即可开始录制你想要的内容。
录制完成后,点击停止录制按钮,保存录制文件即可。
通过这样简单的几步操作,你就能够轻松实现高效录制。
二、Win10录制神器的强大功能Win10录制神器不仅操作简单,还具有许多强大的功能。
首先,它支持多种录制模式,比如全屏录制、窗口录制、区域录制等,满足不同录制需求。
其次,它还支持音频录制,可以录制系统声音和麦克风声音,让你的录制更加完整。
此外,Win10录制神器还支持视频编辑功能,你可以对录制的视频进行剪辑、添加字幕等操作,让你的视频更加精彩。
这些强大的功能使得Win10录制神器成为了一款不可或缺的工具。
三、Win10录制神器的案例应用Win10录制神器在各个领域都有广泛的应用。
比如,在教育领域,老师可以使用Win10录制神器录制教学视频,方便学生远程学习。
在娱乐领域,主播可以使用Win10录制神器录制游戏视频,与粉丝分享游戏乐趣。
在工作领域,员工可以使用Win10录制神器录制会议视频,方便回顾和分享会议内容。
这些案例都充分展示了Win10录制神器的高效性和实用性。
总结:Win10录制神器是一款功能强大、操作简单的录制工具,能够轻松实现高效录制。
无论是教育、娱乐还是工作,Win10录制神器都能够帮助你解决录制过程中的各种问题,让你的录制更加顺利。
因此,我强烈推荐大家使用Win10录制神器,让录制变得更加轻松和高效。
菜科网系统致力于解决 Windows 系统重装解决方案,提供高效、安全、免费的系统重装服务。