效果如下:
本文转自:http://blog.sina.com.cn/s/blog_a6fb6cc90101e8nd.html
问题:标题的换肤背景未显示出来
要实现换肤功能,我们先创建一个基于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