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

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close