地图管理的主要功能是将系统中的地图文件做添加和删除,支持常见的jpg、png、bmp等格式图片,图片分辨率建议小于1080P,最好是和目标客户端电脑分辨率一致,这样在拉伸缩放的时候会比较清晰。图片建议使用鸟瞰图,有3D立体感,类似于那些卖房子售楼部的3D模型,不懂的人还以为是什么高级的技术呢,其实就是一张图片。在做很多需要地图模块的系统的过程中,总结出了几个经验,如下:
第一个是如何快速的加载图片,记得以前有个Qt大神jason写过类似的文章,看过之后才发现,原来和我的做法完全一致,核心就是系统启动的时候将图片文件加载到内存,用QList
第二个是图片名称的管理,一开始做的是取的文件名称加上拓展名直接显示在qlistwidget的节点的text,后面发现有些时候用户会导入一张名字很长的图片文件,此时整个图片列表看起来歪歪扭扭,都被这个很长的名字撑开了,于是加上了过滤,比如超过20个字符,取前面10个和后面10个字符显示,中间加上省略号,最好还可以省去拓展名,毕竟用户从来不关心拓展名,他只知道从这个图片的缩略图单击查看切换,QListWidget的节点有个setIcon函数负责将图片转成缩略图显示,setText负责显示名称,setData负责设置自定义的数据,一般设置Qt::UserRole角色的数据,用来存放图片文件的标识符,这样在单击切换的时候取这个标识符取队列中找到对应的图片显示即可,快速完美。
皮肤开源:https://gitee.com/feiyangqingyun/QWidgetDemo https://github.com/feiyangqingyun/QWidgetDemo
文件名称:styledemo
体验地址:https://gitee.com/feiyangqingyun/QWidgetExe https://github.com/feiyangqingyun/QWidgetExe
文件名称:bin_sams.zip
#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();
}
}
原文:https://www.cnblogs.com/feiyangqingyun/p/11974653.html