地图管理的主要功能是将系统中的地图文件作添加和删除,支持常见的jpg、png、bmp等格式图片,图片分辨率建议小于1080P,最好是和目标客户端电脑分辨率一致,这样在拉伸缩放的时候会比较清晰。图片建议使用鸟瞰图,有3D立体感,相似于那些卖房子售楼部的3D模型,不懂的人还觉得是什么高级的技术呢,其实就是一张图片。在作不少须要地图模块的系统的过程当中,总结出了几个经验,以下:mysql
第一个是如何快速的加载图片,记得之前有个Qt大神jason写过相似的文章,看过以后才发现,原来和个人作法彻底一致,核心就是系统启动的时候将图片文件加载到内存,用QList存储起来,须要的时候根据名称标识符取出对应的图片便可,这样有多个好处,尤为是嵌入式linux上,资源很紧缺,绝大部分时候读写数据的瓶颈在IO,频繁的IO读写会大大下降性能,若是只是在程序启动的时候读写一次放到内存,用到的时候内存访问,那速度真的是瞬间,大部分初学者可能首先使用的是文件路径的方式加载图片,每次都用这种方式加载,当图片很大的时候,切换图片的时候,电脑配置好那没事,那种嵌入式linux的板子,就很卡了,至关于每次都去作了IO读取。linux
第二个是图片名称的管理,一开始作的是取的文件名称加上拓展名直接显示在qlistwidget的节点的text,后面发现有些时候用户会导入一张名字很长的图片文件,此时整个图片列表看起来歪歪扭扭,都被这个很长的名字撑开了,因而加上了过滤,好比超过20个字符,取前面10个和后面10个字符显示,中间加上省略号,最好还能够省去拓展名,毕竟用户历来不关心拓展名,他只知道从这个图片的缩略图单击查看切换,QListWidget的节点有个setIcon函数负责将图片转成缩略图显示,setText负责显示名称,setData负责设置自定义的数据,通常设置Qt::UserRole角色的数据,用来存放图片文件的标识符,这样在单击切换的时候取这个标识符取队列中找到对应的图片显示便可,快速完美。c++
皮肤开源:https://gitee.com/feiyangqingyun/QWidgetDemo https://github.com/feiyangqingyun/QWidgetDemo
文件名称:styledemogit
体验地址:https://gitee.com/feiyangqingyun/QWidgetExe https://github.com/feiyangqingyun/QWidgetExe
文件名称:bin_sams.zipgithub
#include "frmconfigmap.h" #include "ui_frmconfigmap.h" #include "quiwidget.h" #include "api.h" #include "devicemap.h" #include "devicehelper.h" frmConfigMap::frmConfigMap(QWidget *parent) : QWidget(parent), ui(new Ui::frmConfigMap) { ui->setupUi(this); this->initForm(); } frmConfigMap::~frmConfigMap() { delete ui; } void frmConfigMap::initForm() { ui->navTitle->setText("地图列表"); ui->navTitle->setLeftIcon(0xf0e8); ui->navTitle->setRightIcon5(0xf1f8); ui->widgetRight->setFixedWidth(App::RightWidth); DeviceHelper::initDeviceMap(ui->listWidget); if (ui->listWidget->count() > 0) { ui->listWidget->setCurrentRow(0); on_listWidget_pressed(); } } void frmConfigMap::on_listWidget_pressed() { int row = ui->listWidget->currentRow(); if (row < 0) { return; } DeviceHelper::initDeviceMapCurrent(ui->labMap, DBData::MapNames.at(row)); } void frmConfigMap::on_btnInput_clicked() { QString defaultDir = API::getDefaultDir(); QString fileName = API::getFileName("Images (*.png *.bmp *.jpg *.gif *.jpeg)", defaultDir); if (fileName.length() > 0) { QFileInfo f(fileName); QString imageName = f.fileName(); //判断文件是否过大,暂定1MB,过大则弹出提示并不加载 if (f.size() > 1 * 1024 * 1024) { QUIHelper::showMessageBoxError("图片文件过大,请控制在1MB之内,谢谢!", 3); return; } //若是导入的图片有乱码则自动重命名 if (imageName.contains("?") || imageName.length() > 10) { imageName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss.") + f.suffix(); } QString fullName = QString("%1/%2").arg(DBData::MapPath).arg(imageName); //2018-10-18 增长大像素图片过滤,等比例缩放图片 QImage img(fileName); if (img.width() > 1920 || img.height() > 1080) { img = img.scaled(App::MapWidth, App::MapHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation); img.save(fullName); } else { QUIHelper::copyFile(fileName, fullName); } DBData::MapNames.append(imageName); DeviceMap::Instance()->appendMapPix(imageName); DeviceHelper::initDeviceMap(ui->listWidget); DeviceHelper::initDeviceMap(); //自动切换到当前导入的地图 ui->listWidget->setCurrentRow(ui->listWidget->count() - 1); on_listWidget_pressed(); emit changeMap(); } } void frmConfigMap::on_btnDelete_clicked() { int row = ui->listWidget->currentRow(); if (row < 0) { return; } if (QUIHelper::showMessageBoxQuestion("肯定要删除当前选中地图文件吗?") == QMessageBox::Yes) { QString imageName = DBData::MapNames.at(row); QString fileName = QString("%1/%2").arg(DBData::MapPath).arg(imageName); QFile f(fileName); f.remove(); DBData::MapNames.removeOne(imageName); DeviceMap::Instance()->removeMapPix(imageName); DeviceHelper::initDeviceMap(ui->listWidget); DeviceHelper::initDeviceMap(); //若是还有地图则自动切换到第一张地图,没有则清空显示 if (ui->listWidget->count() > 0) { ui->listWidget->setCurrentRow(0); on_listWidget_pressed(); } else { ui->labMap->clear(); } emit changeMap(); } }