//更换皮肤,之后得补充错误检测及扩充一个额外的皮肤选择窗体 void Widget::changeSkin() { /*暂时只是实现将选中的图片保存到一个专门的皮肤文件夹内, * 将所选择的图片设置为窗体的皮肤,所以暂时能想到的操作主要有: * 打开文件选择对话框;将所选中的文件复制到专门的文件夹内,将该文件 * 设置为窗体皮肤 * 之后要补充的是:弹出一个皮肤选择对话框,能够让用户选择在skin文件夹下之前设置过的 * 皮肤,也可以重新选择新的图片作为皮肤 * */ //注意:之后要完善这个换肤的功能,使得像酷狗一样能够弹出一个专门的换肤窗体。 //先在当前路径下创建一个文件夹(目录)skin用于保存要设置的皮肤图片 QString path = QDir::currentPath(); QString skinPathStr = path + "/skin/"; QDir dir(path); QDir skinDir(skinPathStr); if(!skinDir.exists()) { dir.mkdir("skin"); } //bool subdir = dir.mkdir(skin); //然后在打开文件选择对话框,选择图片文件 //获取选择的文件的路径名 QString skinFilePathStr = QFileDialog::getOpenFileName(this, tr("Change Skin"), "/", tr("Skin(*.jpg *.png *.jpeg *.bmp)")); //获取选择的图片基本信息 QString picBaseName = QFileInfo(skinFilePathStr).baseName(); QString picName = QFileInfo(skinFilePathStr).fileName(); //当图片的宽度或高度小于主窗体的宽高值时,需要提示重新选择, //但这里暂时没有实现,之后补充!!! //待复制的皮肤图片的路径及文件全名 QString newSkinName = skinPathStr + picName; //复制选择的图片到特定的文件夹下 QFile::copy(skinFilePathStr, newSkinName); //上面复制到特定文件夹后,图片的名字应该统一一下,但这里暂时还没实现,之后得补上!!! //设置皮肤,暂时测试用,之后修改具体的图片 QPixmap changedPic = QPixmap(newSkinName); this->setSkin(changedPic); this->update(); }
int SkinElementsMgr::cacheSkin(bool force) { if ( cached && !force ) return 0; if ( m_doc ) { //DOMNodeList * list = m_doc->getElementsByTagName("bitmap"); //foreach(list) // DOMElement * node = (DOMElement *)list->getfor(); // SMARTER : load the png files directly ReadDir skinDir(m_skinPath); while (skinDir.next()) { if ( skinDir.isDir() ) { String dir = m_skinPath + skinDir.getFilename(); dir += DIRCHARSTR; ReadDir skinSubDir(dir,"*.png"); while ( skinSubDir.next() ) { int dummy0; int dummy1; int dummy2; int dummy3; int dummy4; int dummy5; int dummy6; ARGB32 * bits = imageLoader::requestBitmap( dir + skinSubDir.getFilename() , &dummy0, &dummy1, &dummy2, &dummy3, &dummy4, &dummy5, &dummy6); if (bits) bitmapcache.addItem(bits); Std::usleep(10); } } } //endfor cached = true; return 1; } return 0; }