有些时候会将多张有相同功能的图片绘制成一张,不管是使用或者绘制上都会方便很多。对美工与开发者来说也都是一件省事、省力、更省心的方式。二全其美,又何乐而不为呢。。。

例如:QQ等级

    0-9可以组成很多种不同的数字等级(不多做解释)!绘制多张图片来描述不同的等级吗?那么请问得绘制多少张呢?想都不敢想。如上方式,已经完全解决了这个问题。

    前提条件:
    美工:制作一张有多张图标相连的图片。
    开发者:只需要根据自己的需求,将部分图片拷贝为副本,再进行合并即可!

下面举个小例子:

#include "qqlevel.h"

QQLevel::QQLevel(QWidget *parent)
: QWidget(parent)
{
setFixedSize(300, 200);
level_button = new QPushButton();
grade_button = new QPushButton();

//分别获取0-9数字图标
QPixmap pixmap_0 = getPixmap(QString(":/level/level_value"), 10, 0);
QPixmap pixmap_1 = getPixmap(QString(":/level/level_value"), 10, 1);
QPixmap pixmap_2 = getPixmap(QString(":/level/level_value"), 10, 2);
QPixmap pixmap_3 = getPixmap(QString(":/level/level_value"), 10, 3);
QPixmap pixmap_4 = getPixmap(QString(":/level/level_value"), 10, 4);
QPixmap pixmap_5 = getPixmap(QString(":/level/level_value"), 10, 5);
QPixmap pixmap_6 = getPixmap(QString(":/level/level_value"), 10, 6);
QPixmap pixmap_7 = getPixmap(QString(":/level/level_value"), 10, 7);
QPixmap pixmap_8 = getPixmap(QString(":/level/level_value"), 10, 8);
QPixmap pixmap_9 = getPixmap(QString(":/level/level_value"), 10, 9);

int count = 3;
int pixmap_width = pixmap_8.width();
int pixmap_height = pixmap_8.height();

//最前面LV图标
QPixmap pixmap_lv(":/level/lv");
int lv_width = pixmap_lv.width();
QPixmap total_pixmap(QSize(pixmap_width*count + lv_width, pixmap_height));
QPainter painter(&total_pixmap);

//绘制LV图标
painter.drawPixmap(QRect(0, 0, lv_width, pixmap_height), pixmap_lv);

//再绘制LV888图标
for(int i=0; i
{
painter.drawPixmap(QRect(lv_width+pixmap_width*i, 0, pixmap_width, pixmap_height), pixmap_8);
}

level_button->setFixedHeight(30);
level_button->setIcon(total_pixmap);
level_button->setIconSize(total_pixmap.size());

//分别获取皇冠、太阳、月亮、星星、...等图标
QPixmap pixmap_grade_0 = getPixmap(QString(":/level/grade"), 5, 0);
QPixmap pixmap_grade_1 = getPixmap(QString(":/level/grade"), 5, 1);
QPixmap pixmap_grade_2 = getPixmap(QString(":/level/grade"), 5, 2);
QPixmap pixmap_grade_3 = getPixmap(QString(":/level/grade"), 5, 3);
QPixmap pixmap_grade_4 = getPixmap(QString(":/level/grade"), 5, 4);

//绘制5个皇冠
int grade_count = 5;
int pixmap_grade_width = pixmap_grade_0.width();
int pixmap_grade_height = pixmap_grade_0.height();
QPixmap total_grade_pixmap(QSize(pixmap_grade_width*grade_count, pixmap_grade_height));
QPainter grade_painter(&total_grade_pixmap);
for(int i=0; i
{
grade_painter.drawPixmap(QRect(pixmap_grade_width*i, 0, pixmap_grade_width, pixmap_grade_height), pixmap_grade_0);
}
grade_button->setFixedHeight(30);
grade_button->setIcon(total_grade_pixmap);
grade_button->setIconSize(total_grade_pixmap.size());


QVBoxLayout *main_layout = new QVBoxLayout();
main_layout->addStretch();
main_layout->addWidget(level_button);
main_layout->addWidget(grade_button);
main_layout->addStretch();
main_layout->setSpacing(20);
main_layout->setContentsMargins(0, 0, 0, 0);

setLayout(main_layout);
}

QQLevel::~QQLevel()
{

}

QPixmap QQLevel::getPixmap(QString pixmap_name, int count, int index)
{
QPixmap final_pixmap;
if(!pixmap_name.isEmpty() && count > 0)
{
QPixmap pixmap(pixmap_name);
int pixmap_width = pixmap.width()/count;
int pixmap_height = pixmap.height();
final_pixmap = pixmap.copy(pixmap_width*index, 0, pixmap_width, pixmap_height);
}

return final_pixmap;
}

运行效果如下:


好了,多张图片的切分与合并完美实现,It's so easy!

Qt之图标切分与合并的更多相关文章

  1. Qt之图标切分与合并(关键是使用QPixmap的copy函数来拷贝整张图片的某个区域)

    有些时候会将多张有相同功能的图片绘制成一张,不管是使用或者绘制上都会方便很多.对美工与开发者来说也都是一件省事.省力.更省心的方式.二全其美,又何乐而不为呢... 例如:QQ等级           ...

  2. Qt中用QSS切分图片

    Qt设计时有时需要实现动态按钮,按钮点击时一个状态,鼠标悬浮时一个状态,离开时一个状态,静止时一个状态.可以用一张png长图,使用QSS分段截取,分配给每一个状态.    1.调用函数 SetButt ...

  3. [Qt] fontawesome图标

    fontawesome图标 fontawesome是一个图标的集合,里面有好多的图标,使用起来也还是非常方便的. 图标信息可以到官网去查:http://fontawesome.io/cheatshee ...

  4. Qt标题栏图标和运行程序图标设置

    一.标题栏图标 1.*.qrc资源文件中添加图片 2.添加代码 setWindowIcon(QIcon(":/images/paste.png")); //设置窗口上的图标,需要在 ...

  5. QT+qtablewidget自定义表头【合并单元格】

    1.把下列文件放在工程中[已上传到我的文件中] 2.代码 auto *headview = new HHeadViewClass(Qt::Horizontal, ui.tableWidget); he ...

  6. VS2010生成Qt程序图标修改方法

    转自:http://blog.csdn.net/simeone18/article/details/7344547 1.准备ico文件,nuistcard.ico 2.在nuistcard工程目录,建 ...

  7. Qt exe图标

    1.首先准备一张ico照片,也可以通过http://www.ico.la/生成: 2.把ico照片拷贝到项目工程下,比如:“pic.ico” 3.在工程下,创建一个文件“myapp.rc”,用txt打 ...

  8. cornerstone 使用-图标含义-分支-合并

    http://www.jianshu.com/p/7f5c019c528b http://www.cnblogs.com/fyongbetter/p/5404697.html

  9. QT添加程序图标及窗口图标

    程序图标 材料准备 图标文件:*.ico文件,存放在源文件同一目录下,如"myapp.ico" 写入图标 向*.pro文件中,独立一行写入"RC_ICONS = *.ic ...

随机推荐

  1. gcc/交叉编译

    一.gcc编译的情况: 1.linux gcc包含的c/c++编译器,gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译. 2.linux gcc的应用: ...

  2. 【转】IOS开发:[1]Xcode5界面入门

    ios开发离不开xcode,这篇以xcode5界面来介绍一下xcode的界面都有哪些内容. 工具/原料 xcode5 整体来看区域有哪些? 1 首先我们先整体来看一下,xcode5界面可以分为五大主要 ...

  3. ubuntu切换root

    sudo passwd root这个命令是给root用户设定密码.然后su root切换到root用户.

  4. 利用COPYDATASTRUCT传递命令行参数给驻留内存的进程(SendMessage应用)

    我们知道Window进程之间通过API的SendMessage方法传递消息.但是方法参数lParam是Long型,那么如果传递一个字符串(譬如命令行参数)应该怎么办呢,甚至一个对象.结构呢.VB的发送 ...

  5. eclipse 编辑器的使用

    随着所编辑的文件数目的增加以及在这些文件之间的快速切换,一个又一个文件的编码以及对编辑器会话(session)的管理将会变得非常复杂.这时,有几件事情你是可以做的. 通过使用键盘快捷键,你可以快速选择 ...

  6. DouNet学习_代码生成器

    string conn = "Data Source={0};Initial Catalog={1};User Id={2};Password={3}"; //点击链接 priva ...

  7. 看过的bootstrap书籍(附下载地址)

    http://yun.baidu.com/share/link?shareid=3820784617&uk=1008683945 以下书籍下载地址. <BootStrap入门教程> ...

  8. FbinstTool万能启动超级简单教程

    转载自http://bbs.wuyou.com/forum.php?mod=viewthread&tid=156383 秒到1分钟时间.如果你导入的是超过几百M以上的文件,相对的等待时间会更长 ...

  9. LINQ标准查询操作符(五)

    十二.相等操作符 如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则视这两个序列相等. SequenceEqual方法通过并行地枚举两个数据源并比较相应元素来判断两个序列是否相等.如果两个序 ...

  10. HD2025查找最大元素

    查找最大元素 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...