http://blog.csdn.net/liang19890820/article/details/9234855
其实网上有过360界面一些小细节的实现,基本的也都比较简单,项目完事,闲来无事,就按照自己电脑的360安全卫士9.1做了一个界面,包括托盘、最小化、最大化、界面风格样式美化等!
效果如下:
有人可能会好奇,界面的图片跟360的一样,开始的时候我也比较头疼,要做界面怎么可以没有图片呢!然后呢,既然安装过360,里面会有界面的一部分图片(当然,不是全部都有),把里面的图片拿出来,至于其它没有的那就只能找人做了,界面的美观度与美工有很大的关系!在这里谢过我的师傅(软件工程师兼职美工,你值得拥有)
标题栏:
关于标题栏的按钮样式(皮肤、最小化、最大化、关闭等)不再多说,三种状态:正常、鼠标划过、鼠标按下!可以由QPushButton、QToolButton实现均可,关于标题“360安全卫士9.1”可由QLabel实现,设置字体为白色即可!
在这里我把“电脑体检、木马查杀等”这部分功能栏也称为标题栏,当双击其空白处也可实现窗体的最大化,通过点击不同的按钮来切换至不同的界面,按钮由QToolButton实现,设置其文本位于图标之下、,后面的“360安全卫士”是一张图片,在安装包里可以找到!
代码如下:
#include "title_widget.h"
#include "tool_button.h"
TitleWidget::TitleWidget(QWidget *parent)
:QWidget(parent)
{
version_title = new QLabel();
skin_button= new PushButton();
main_menu_button = new PushButton();
min_button =new PushButton();
max_button =new PushButton();
close_button= new PushButton();
medal_button = new QPushButton();
version_title->setStyleSheet("color:white;");
//设置图片
skin_button->loadPixmap(":/sysButton/skin_button");
main_menu_button->loadPixmap(":/sysButton/main_menu");
min_button->loadPixmap(":/sysButton/min_button");
max_button->loadPixmap(":/sysButton/max_button");
close_button->loadPixmap(":/sysButton/close_button");
QIconmedal_icon(":/contentWidget/medal");
medal_button->setIcon(medal_icon);
medal_button->setFixedSize(25, 25);
medal_button->setIconSize(QSize(25,25));
medal_button->setStyleSheet("background:transparent;");
connect(skin_button, SIGNAL(clicked()), this,SIGNAL(showSkin()));
connect(main_menu_button, SIGNAL(clicked()),this, SIGNAL(showMainMenu()));
connect(min_button, SIGNAL(clicked()), this,SIGNAL(showMin()));
connect(max_button, SIGNAL(clicked()), this,SIGNAL(showMax()));
connect(close_button, SIGNAL(clicked()), this,SIGNAL(closeWidget()));
QHBoxLayout *title_layout = new QHBoxLayout();
title_layout->addWidget(version_title,0,Qt::AlignVCenter);
title_layout->addStretch();
title_layout->addWidget(medal_button, 0,Qt::AlignTop);
title_layout->addWidget(skin_button, 0, Qt::AlignTop);
title_layout->addWidget(main_menu_button, 0,Qt::AlignTop);
title_layout->addWidget(min_button, 0, Qt::AlignTop);
title_layout->addWidget(max_button, 0, Qt::AlignTop);
title_layout->addWidget(close_button, 0, Qt::AlignTop);
title_layout->setSpacing(0);
title_layout->setContentsMargins(0, 0, 5,0);
version_title->setContentsMargins(15, 0, 0,0);
skin_button->setContentsMargins(0, 0, 10,0);
QStringList string_list;
string_list<<":/img/toolWidget/tiJian.png"<<":/img/toolWidget/muMa.png"<<":/img/toolWidget/louDong.png"<<
":/img/toolWidget/xiTong.png"<<":/img/toolWidget/qingLi.png"<<":/img/toolWidget/jiaSu.png"<<
":/img/toolWidget/menZhen.png"<<":/img/toolWidget/ruanJian.png";
QHBoxLayout *button_layout = newQHBoxLayout();
QSignalMapper *signal_mapper = newQSignalMapper(this);
for(int i=0; i
{
ToolButton *tool_button = newToolButton(string_list.at(i));
button_list.append(tool_button);
connect(tool_button,SIGNAL(clicked()), signal_mapper, SLOT(map()));
signal_mapper->setMapping(tool_button,QString::number(i, 10));
button_layout->addWidget(tool_button,0, Qt::AlignBottom);
}
connect(signal_mapper, SIGNAL(mapped(QString)),this, SLOT(turnPage(QString)));
QLabel *logo_label = new QLabel();
QPixmap pixmap(":/img/logo.png");
logo_label->setPixmap(pixmap);
logo_label->setFixedSize(pixmap.size());
logo_label->setCursor(Qt::PointingHandCursor);
button_layout->addStretch();
button_layout->addWidget(logo_label);
button_layout->setSpacing(8);
button_layout->setContentsMargins(15, 0, 0,0);
QVBoxLayout *main_layout = newQVBoxLayout();
main_layout->addLayout(title_layout);
main_layout->addLayout(button_layout);
main_layout->setSpacing(0);
main_layout->setContentsMargins(0, 0, 0,0);
this->translateLanguage();
setLayout(main_layout);
setFixedHeight(100);
is_move =false;
}
void TitleWidget::translateLanguage()
{
version_title->setText(tr("title"));
skin_button->setToolTip(tr("changeskin"));
main_menu_button->setToolTip(tr("mainmenu"));
min_button->setToolTip(tr("minimize"));
max_button->setToolTip(tr("maximize"));
close_button->setToolTip(tr("close"));
button_list.at(0)->setText(tr("power"));
button_list.at(1)->setText(tr("mummy"));
button_list.at(2)->setText(tr("hole"));
button_list.at(3)->setText(tr("repair"));
button_list.at(4)->setText(tr("clear"));
button_list.at(5)->setText(tr("optimize"));
button_list.at(6)->setText(tr("expert"));
button_list.at(7)->setText(tr("software"));
}
void TitleWidget::mousePressEvent(QMouseEvent *e)
{
press_point= e->pos();
is_move =true;
}
void TitleWidget::mouseMoveEvent(QMouseEvent *e)
{
if((e->buttons() == Qt::LeftButton) && is_move)
{
static QWidget* parent_widget = this->parentWidget();
QPoint parent_point = parent_widget->pos();
parent_point.setX(parent_point.x() + e->x() -press_point.x());
parent_point.setY(parent_point.y() + e->y() -press_point.y());
parent_widget->move(parent_point);
}
}
void TitleWidget::mouseReleaseEvent(QMouseEvent *)
{
if(is_move)
{
is_move = false;
}
}
void TitleWidget::mouseDoubleClickEvent(QMouseEvent *)
{
emitshowMax();
}
void TitleWidget::turnPage(QString current_page)
{
bool ok;
int current_index = current_page.toInt(&ok,10);
for(int i=0; i
{
ToolButton *tool_button =button_list.at(i);
if(current_index == i)
{
tool_button->setMousePress(true);
}
else
{
tool_button->setMousePress(false);
}
}
}
这里包括重写鼠标事件mousePressEvent、mouseMoveEvent、mouseReleaseEvent来控制主窗体的移动、通过mouseDoubleClickEvent来实现双击最大化等,translateLanguage()主要是为了后面实现多语化使用!
注:技术在于交流、在于沟通,分享内容请勿用作商业途径,转载请说明出处,违者必究!