Qt浅谈之五十二显示shape表格并自动搜索图片

2024-03-11 10:08

本文主要是介绍Qt浅谈之五十二显示shape表格并自动搜索图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

        Qt版本(Qt_5_9_5_MinGW_32bit,Qt更高版本是64位需要编译第三方64位库)下,加载shape文件并显示,然后点击对应的图片字段弹出图片,使用于特殊环境下图片的筛选。同时也要处理显示的中文乱码问题。完整代码已上传csdn。

二、详解

1、代码

(1)dispalypic.h

#ifndef DISPALYPIC_H
#define DISPALYPIC_H#include <QDialog>
#include "ogrsf_frmts.h"namespace Ui {
class dispalypic;
}class dispalypic : public QDialog
{Q_OBJECTpublic:explicit dispalypic(QWidget *parent = nullptr);~dispalypic();bool setPath(QString shp_file, QString pic_path);private slots:void slotDoubleClicked(int row, int column);private:bool parse_shp_file();QString utf8_to_gbk(const char *source);private:Ui::dispalypic *ui;QString m_shp_path;QString m_pic_path;
};#endif // DISPALYPIC_H

(2)dispalypic.cpp

#include <QDir>
#include <QProcess>
#include <QTextCodec>
#include "dispalypic.h"
#include "ui_dispalypic.h"dispalypic::dispalypic(QWidget *parent) :QDialog(parent),ui(new Ui::dispalypic)
{ui->setupUi(this);this->setFixedSize(1600, 800);ui->tableWidget->setFixedSize(1600, 800);//ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//ui->tableWidget->verticalHeader()->setStretchLastSection(true);ui->tableWidget->resizeColumnsToContents();ui->tableWidget->resizeRowsToContents();ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);ui->tableWidget->horizontalHeader()->setMinimumSectionSize(100);ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);connect(ui->tableWidget,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(slotDoubleClicked(int,int)));
}dispalypic::~dispalypic()
{delete ui;
}bool dispalypic::setPath(QString shp_file, QString pic_path)
{m_shp_path = shp_file;m_pic_path = pic_path;return parse_shp_file();
}bool dispalypic::parse_shp_file()
{const char *pszDriverName = "ESRI Shapefile"; CPLSetConfigOption( "GDAL_FILENAME_IS_UTF8","NO" );CPLSetConfigOption( "SHAPE_ENCODING", "UTF-8");RegisterOGRShape();//OGRRegisterAll();OGRSFDriverRegistrar* pReg = OGRSFDriverRegistrar::GetRegistrar();OGRSFDriver* poDriver = pReg->GetDriverByName(pszDriverName);if (!poDriver){return false;}OGRDataSource *poDS = poDriver->Open( m_shp_path.toLocal8Bit().data(), FALSE );if (!poDS)  return false;OGRLayer *poLayer = poDS->GetLayer(0);poLayer->ResetReading();OGRFeatureDefn *m_FDef = poLayer->GetLayerDefn();QStringList header;for(int index= 0; index < m_FDef->GetFieldCount(); index++ ){OGRFieldDefn *m_Field = m_FDef->GetFieldDefn( index );//printf( "--------%s", m_Field->GetNameRef() );//const char *data = m_Field->GetNameRef();QString v_data = utf8_to_gbk(m_Field->GetNameRef());header.append(v_data);}ui->tableWidget->setColumnCount(m_FDef->GetFieldCount());ui->tableWidget->setHorizontalHeaderLabels(header);//printf( "\n");poLayer->ResetReading();OGRFeature *poFeature = NULL;int m_record_lines = 0;ui->tableWidget->setRowCount(poLayer->GetFeatureCount());while( (poFeature = poLayer->GetNextFeature()) != NULL ){OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();for(int iField = 0; iField < poFDefn->GetFieldCount(); iField++ ){
//            OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField );
//            printf( "--------%s\n", poFieldDefn->GetNameRef() );//根据字段值得类型,选择对应的输出
//            if( poFieldDefn->GetType() == OFTInteger )
//                printf( "%d,", poFeature->GetFieldAsInteger( iField ) );
//            else if( poFieldDefn->GetType() == OFTReal )
//                printf( "%.3f,", poFeature->GetFieldAsDouble(iField) );
//            else if( poFieldDefn->GetType() == OFTString )
//                printf( "%s,", poFeature->GetFieldAsString(iField) );
//            else
//                printf( "%s,", poFeature->GetFieldAsString(iField) );//QString v_data = QStringLiteral("%1").arg(poFeature->GetFieldAsString(iField));QString v_data = utf8_to_gbk(poFeature->GetFieldAsString(iField));ui->tableWidget->setItem(m_record_lines,iField,new QTableWidgetItem(v_data));}m_record_lines++;OGRFeature::DestroyFeature( poFeature );}OGRDataSource::DestroyDataSource( poDS );return true;
}void dispalypic::slotDoubleClicked(int row, int column)
{QString v_text = ui->tableWidget->item(row, column)->text().trimmed();if (v_text.contains("jpg", Qt::CaseInsensitive) || v_text.contains("png", Qt::CaseInsensitive)){QString v_file = QStringLiteral("%1\\%2").arg(m_pic_path).arg(v_text);if (QFile::exists(v_file)){QProcess::startDetached("C:\\Program Files (x86)\\HDPicViewer\\HDPicViewer.exe", QStringList(v_file));}}
}QString dispalypic::utf8_to_gbk(const char *source)
{QTextCodec::ConverterState state;QTextCodec *codec = QTextCodec::codecForName("UTF-8");QString text = codec->toUnicode( source, strlen(source), &state);if (state.invalidChars > 0){text = QTextCodec::codecForName( "GBK" )->toUnicode(source);}else{text = source;}return text;
}

 

2、编译运行


三、总结

(1)上述代码只是为了解决工作中的问题,具体的业务代码需自己扩展。需要下载:HD图片查看器1.2.0.22.ex,图片浏览工具。

(2)完整的代码已上传到csdn上:https://download.csdn.net/download/taiyang1987912/11914388
(3)若有问题或建议,请留言,在此感谢!

这篇关于Qt浅谈之五十二显示shape表格并自动搜索图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797502

相关文章

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源