效果如下:
本文转自: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