Qt实现360安全卫士换肤功能

效果如下:

             

    问题:标题的换肤背景未显示出来

   要实现换肤功能,我们先创建一个基于drop_shadow_widget的护肤界面,我们将换肤界面分为上中下三部分。(drop_shadow_widget的功能一会说)

  • 上部含有两个QLabel和一个QPushButton按钮。
  • 中间先显示首页8个皮肤,根据不同的页面加载不同的皮肤,当皮肤更新时,重新显示新皮肤。(封装一个类包含3个QLabel 和一个QPushButton)
  • 底部用于显示页码        

  

#pragma once
/*
   功能:上一页,下一页,换肤按钮
*/
#include <QDialog>
#include <QWidget>
#include <QSignalMapper>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
#include "common.h"
#include "push_button.h"
#include "change_skin_widget.h"
#include "drop_shadow_widget.h"
class skin_widget : public drop_shadow_widget
{
	Q_OBJECT

public:
	skin_widget(QWidget *parent=0);
	~skin_widget();
	void translateLanguage();

protected:
	//重画事件
	void painEvent(QPaintEvent *event);
signals:
	void changeSkin(QString skin_name);

private slots:
    void showPage(QString current_skin);
	void varyfySkin();

private:
	void initTitle();
	void initCenter();
	void initBotton();
private:

	QString skin_name;  //背景图片
	bool is_change;     //是否改变背景
	QStringList skin_list; 
	QStringList tip_list;

	QHBoxLayout *title_layout;
	QGridLayout *center_layout;
	QHBoxLayout *botton_layout;

	QLabel *title_label;      //标题
	QLabel *title_icon_label; //标题图标
	push_button *close_button;//关闭按钮
	int page_count;           //总页数
	int page_count_point;     //最后一页的显示个数
	int current_page;         //当前为第几页

	QPushButton *frist_page_button;
	QPushButton *previous_page_button;
	QPushButton *next_page_button;
	QPushButton *last_page_button;

	QList<change_skin_widget *>change_skin_list;
};
#include "skin_widget.h"
#include "util.h"
skin_widget::skin_widget(QWidget *parent)
  : drop_shadow_widget(parent)
{
	this->resize(620,445);
	skin_name = QString("");
	is_change = false;
	current_page = 1;

	this->initTitle();
	this->initCenter();
	this->initBotton();

	QVBoxLayout *main_layout = new QVBoxLayout();
	main_layout->addLayout(title_layout);
	main_layout->addLayout(center_layout);
	main_layout->addLayout(botton_layout);
	main_layout->addStretch();
	main_layout->setSpacing(0);
	main_layout->setContentsMargins(SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH);
	setLayout(main_layout);

	this->translateLanguage();
	//将十进制数转换为字符串类型
	this->showPage(QString::number(current_page, 10));
}

skin_widget::~skin_widget()
{

}
void skin_widget::initTitle()
{
	title_label = new QLabel();
	title_icon_label = new QLabel();
	close_button = new push_button();
   
	QPixmap title_pixmap(":/img/safe");
	title_icon_label->setPixmap(title_pixmap);
	title_icon_label->setFixedSize(16,16);
	//图片自适应窗口控件的大小
	title_icon_label->setScaledContents(true);

	close_button->setPicName(":/sysButton/close");
	title_label->setFixedHeight(30);

	title_layout = new QHBoxLayout();
	title_layout->addWidget(title_icon_label,0,Qt::AlignVCenter);
	title_layout->addWidget(title_label,0,Qt::AlignVCenter);
	title_layout->addStretch();
	title_layout->addWidget(close_button,0,Qt::AlignTop);
	title_layout->setSpacing(5);
	title_layout->setContentsMargins(10,0,5,0);

	//title_label->setObjectName("whiteLabel");
	connect(close_button,SIGNAL(clicked()),this,SLOT(hide()));
}
void skin_widget::initCenter()
{
	skin_list << ":/skin/0" << ":/skin/1" << ":/skin/2" << ":/skin/3" << ":/skin/4" <<
		":/skin/5" << ":/skin/6" << ":/skin/7" << ":/skin/8" << ":/skin/9" <<
		":/skin/10" << ":/skin/11" << ":/skin/12" << ":/skin/13" << ":/skin/14" <<
		":/skin/15" << ":/skin/16" << ":/skin/17" << ":/skin/18" << ":/skin/19" <<
		":/skin/20" << ":/skin/21" << ":/skin/22" << ":/skin/23";

	center_layout = new QGridLayout();
	center_layout->setSpacing(5);
	center_layout->setContentsMargins(5, 35, 5, 0);

	for (int i = 0; i < 8;i++)
	{
		change_skin_widget *change_skin_widge = new change_skin_widget();
		change_skin_list.append(change_skin_widge);
		connect(change_skin_widge,SIGNAL(changeSkin()),this,SLOT(varyfySkin()));
		center_layout->addWidget(change_skin_widge,i/4,i%4);
	}
	int skin_list_count = skin_list.size();
	page_count = skin_list_count / 8;
	page_count_point = skin_list_count % 8;  //最后一页显示的个数
	//就算最后一页不满8个,也得新增一页
	if (page_count_point>0)
	{
		page_count = page_count + 1;
	}

}
//显示页码 
void skin_widget::initBotton()
{
	QSignalMapper *signal_mapper = new QSignalMapper(this);
	QList<QPushButton *>*button_list = new QList<QPushButton *>();
	for (int i = 0; i < page_count;i++)
	{
		QPushButton *page_button = new QPushButton();
		page_button->setFixedWidth(20);
		page_button->setText(QString::number(i+1,10));
		page_button->setObjectName("blueButton");
		page_button->setCursor(Qt::PointingHandCursor);
		connect(page_button,SIGNAL(clicked()),signal_mapper,SLOT(map()));
		signal_mapper->setMapping(page_button,page_button->text());
	    //压入列表
		button_list->push_back(page_button);
	}
	frist_page_button = new QPushButton();
	previous_page_button = new QPushButton();
	next_page_button = new QPushButton();
	last_page_button = new QPushButton();
	frist_page_button->setFixedWidth(50);
	previous_page_button->setFixedWidth(50);
	next_page_button->setFixedWidth(50);
	last_page_button->setFixedWidth(50);
	frist_page_button->setCursor(Qt::PointingHandCursor);
	previous_page_button->setCursor(Qt::PointingHandCursor);
	next_page_button->setCursor(Qt::PointingHandCursor);
	last_page_button->setCursor(Qt::PointingHandCursor);
	frist_page_button->setObjectName("blueButton");
	previous_page_button->setObjectName("blueButton");
	next_page_button->setObjectName("blueButton");
	last_page_button->setObjectName("blueButton");

	connect(frist_page_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));
	connect(previous_page_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));
	connect(next_page_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));
	connect(last_page_button, SIGNAL(clicked()), signal_mapper, SLOT(map()));
	signal_mapper->setMapping(frist_page_button, "first");
	signal_mapper->setMapping(previous_page_button, "previous");
	signal_mapper->setMapping(next_page_button, "next");
	signal_mapper->setMapping(last_page_button, "last");
	connect(signal_mapper, SIGNAL(mapped(QString)), this, SLOT(showPage(QString)));
	//布局
	botton_layout = new QHBoxLayout();
	botton_layout->addStretch();
	botton_layout->addWidget(frist_page_button,0,Qt::AlignCenter);
	botton_layout->addWidget(previous_page_button, 0, Qt::AlignCenter);
	for (int i = 0; i < button_list->count();i++)
	{
		QPushButton *page_button = button_list->at(i);
		botton_layout->addWidget(page_button,0,Qt::AlignCenter);
	}
	botton_layout->addWidget(next_page_button, 0, Qt::AlignCenter);
	botton_layout->addWidget(last_page_button, 0, Qt::AlignCenter);
	botton_layout->addStretch();
	botton_layout->setSpacing(2);
	botton_layout->setContentsMargins(0,10,0,0);
}
void skin_widget::showPage(QString current_skin)
{
	if (current_skin == "first")
	{
		current_page = 1;
	}
	else if (current_skin == "previous")
	{
		if (current_page>1)
		{
			current_page = current_page - 1;
		}
	}
	else if (current_skin == "next")
	{
		if (current_page<page_count)
		{
			current_page = current_page + 1;
		}
	}
	else if (current_skin == "last")
	{
		current_page = page_count;
	}
	else
	{
		bool ok;
		current_page = current_skin.toInt(&ok,10);
	}
	if (current_page==1)
	{
		next_page_button->show();
		last_page_button->show();
		frist_page_button->hide();
		previous_page_button->hide();
	}
	else if (current_page==page_count)
	{
		next_page_button->hide();
		last_page_button->hide();
		frist_page_button->show();
		previous_page_button->show();
	}
	else
	{
		next_page_button->show();
		last_page_button->hide();
		frist_page_button->hide();
		previous_page_button->show();
	}
	
	//第一页为0-7 显示至previous_total_page
	int previous_total_page = (current_page - 1) % 8;
	int tip_index = previous_total_page;

	for (int i = 0; i < change_skin_list.count();i++)
	{
		change_skin_list.at(i)->changeSkin(":/skin/" + QString::number(previous_total_page++, 10), tip_list.at(tip_index++), "11");
	}

}
void skin_widget::translateLanguage()
{
	title_label->setText(tr("title"));
	close_button->setToolTip(tr("close"));

	frist_page_button->setText(tr("first"));
	previous_page_button->setText(tr("previous"));
	next_page_button->setText(tr("next"));
	last_page_button->setText(tr("last"));

	tip_list << tr("profound life") << tr("blue sea") << tr("red heart") << tr("lovely baby") << tr("transparent water") <<
		tr("flower") << tr("great sunshine") << tr("shadow amazement") << tr("life in blossom") << tr("360 pet") <<
		tr("beautiful stone") << tr("yellow energy") << tr("magic world") << tr("intense emotion") << tr("dream sky") <<
		tr("angry bird") << tr("graceful jazz") << tr("card") << tr("summer cool") << tr("blue world") <<
		tr("woodwind") << tr("pink mood") << tr("across time") << tr("six year");
}
void skin_widget::varyfySkin()
{
	QObject *object = QObject::sender();
	change_skin_widget *change_skin_widge = qobject_cast<change_skin_widget *>(object);
	skin_name = change_skin_widge->getPixmapName();

	this->skin_name = skin_name;
	is_change = true;
	update();
	emit changeSkin(skin_name);
}
void skin_widget::painEvent(QPaintEvent *event)
{
	drop_shadow_widget::paintEvent(event);
	//QString skin_name = util::getSkinName();
	int height = 35;
	//换肤界面标题栏的背景设计
	QPainter painter(this);
	painter.setPen(Qt::NoPen);
	painter.setBrush(Qt::white);
	painter.drawPixmap(QRect(SHADOW_WIDTH, SHADOW_WIDTH, this->width() - 2 * SHADOW_WIDTH, this->height() - 2 * SHADOW_WIDTH), QPixmap(skin_name));
	painter.drawRect(QRect(SHADOW_WIDTH, height, this->width() - 2 * SHADOW_WIDTH, this->height() - height - SHADOW_WIDTH));
}
注:换肤界面含有阴影边框,其实实现在drop_shadow_widget类中。
本文转自:http://blog.sina.com.cn/s/blog_a6fb6cc90101e8nd.html

猜你喜欢

转载自blog.csdn.net/m0_37806112/article/details/80256347