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

相关文章

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅