qt实验报告.docx
《qt实验报告.docx》由会员分享,可在线阅读,更多相关《qt实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
qt实验报告
嵌入式系统界面设计实验
实验题目:
基于Qt的图片表格转换
学院:
**学院
专业:
电子信息工程
班级:
学号:
姓名:
小组成员:
编写日期:
2019.10
1.实验设计背景
当今办公室中有不少的表格是基于图片的这给后期人员的校对处理带来了不少的麻烦,特别是列数较多行数较多的表格。
在将表通过人工的方法转换为Excel表格时容易出现差错,表格行列错位、数据抄错等等问题。
长时间的工作还容易损害校对人员的健康。
2.实验设计目的
1.将表格分解成小片,以便于人工填写
2.尽可能的通过软件将图片数字转换为文字
3.Excel表格导出
3.实验设计环境
VisualStudioCode
Python3.7
Python包:
Pytesseract、openpyxl、numpy、cv2
QtCreater
Tesseract-OCR
4.实验系统需求分析
4.1系统调查
在许多小公司的办公中,由于大多业务系统都是使用的通用的模板,没有对具体情形进行优化,以及以前未使用办公系统的历史遗留问题,在实际的办公中经常会出现大量图像表格,需要人为地输入到EXCEL表格中以用于后续公司的各项统计工作
4.2用户需求
将PNG、JPG、BMP等格式的图片表格转化为EXCEL的数字表格方便后续的统计工作
4.3可行性分析
Python中中存在大量的用于图像处理的库opencv等可以方便地对图像表格进行处理分割成小块。
Tesseract(识别引擎),一款由HP实验室开发由Google维护的开源OCR(OpticalCharacterRecognition,光学字符识别)引擎,与MicrosoftOfficeDocumentImaging(MODI)相比,我们可以不断的训练的库,使图像转换文本的能力不断增强;如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。
软件自带的数据可以很好地识别英文字母、数字和常见地英文标点。
表格中为最为繁重的是数字地输入,Tesseract在纯数字识别时相比带文字、标点表现效果更好。
4.4系统业务流程图
图1系统业务流程图
5.实验具体操作步骤及方法
5.1程序运行开始主界面
图2主界面1
图3主界面2
5.2用户修改界面
图4用户修改界面
5.3最终生成表格
表1数据
6.实验结果分析
优点:
1.程序数字识别效果较好识别率能达到80%以上
2.图像表格只要是正矩形有明显边框、软件就可以较好地分割图片
缺点:
1.软件中去除了对英文、中文的识别支持,当要识别文字时效果较差文字的识别效果不佳需要根据软禁实际使用环境加入字典才能令文字检测效果在可令人接受的范围内
2.对倾斜的表格无法分割并识别其中的内容
3.无法处理倾斜扭曲地表格
走过的弯路:
在进行txt文件的打开与保存过程中,一开始由于txt文件的编码问题,错误的以二进制文件的形式进行了保存,这种方式如果只在本程序中对文档进行操作,则不会发现问题,而当实际打开保存的txt文件时则会发现,保存的全是乱码。
这是由于txt文件为文本文件,解码方式为ASCII码,所以以二进制形式存储时将会出现乱码。
在进行交叉编程的时候由于XX资料较少只用用python官方原文档作为参考资料进行编程。
其中库路径的添加对我造成了很大的干扰。
Python中c存在一个HONEPATH的环境变量用于储存python程序中需要引用的库文件。
由于前期不知道这个变量如何设置,在后续的编程中出现了许多莫名奇妙的错误。
给出PATH即可解决。
7.实验效果图
表2原图片表格
表3导出表格
8.实验设计具体任务分工
陈***:
项目总体规划,界面设计,混合编程。
卢***:
界面调试,材料整理、报告编写。
张***:
报告修改、界面美化。
9.实验设计心得体会
通过这次Qt Widgets的程序设计,我们能熟练地掌握Qt语言,通过每章每节的学习让我知道了Qt的重要性,学习Qt能让我们深刻的知道在以后的工作中能用到,还有让我知道学习的重要意义,通过对Qt的学习能让我们解决很多的实际东西,QT能让我们锻炼自己的编程能力,还能处理许多别的语言处理不了的东西,我知道了学习Qt不仅能提高自己的认识,还巩固了对原来学过的其他语言的学习。
这对我们自身的提升都是很重要的,将所学的知识进行运用,这是学习的乐趣之一。
QtWidgets的程序设计,我体会到很多,完成一个程序的设计必须要有同伴的支持和合作,必须要跟同伴讨论商量,共同努力才有可能设计出一个好的程序,遇到困难不能轻易放弃,在编这个程序的时候遇到了很多难题,后来在老师和同学的帮助解答下终于将遇到的问题一个个解决,我深刻体会到遇到难题不要轻易言弃,还有要多借鉴别人的经验,多阅读一些书籍,编写程序的时候要细心,一点点错误程序就可能编译失败,所以要做到一丝不苟。
以及此次是我们第一次进行嵌入式系统界面设计,鉴于自身学疏才浅,能力有限,竭尽所能,却只能设计这样平平无奇的小程序,使得我们全员深感惭愧,由此,专业知识的重要性可见一斑。
路漫漫其修远兮,吾将上下而求索,身处电信行业的我们脚下的学途还很长呐。
参考文献
[1]谢希仁.计算机网络[M].5版.北京:
电子工业出版社,2008.
[2]AlSweigartPython编程快速上手化[M].北京:
人民邮电出版社,2016:
238-247.
[3]独自听涛.轻松把Excel表格转换为图片[J].家庭电脑世界,2004,000(11X):
42.
[4]张海鹏,宁占彬,于仲华.嵌入式系统通用输入界面框架设计与实现[J].电脑编程技巧与维护,2012,(22):
84-86,92.DOI:
10.3969/j.issn.1006-4052.2012.22.039.
[5]王珊,萨师煊.数据库系统概论[M].4版.北京:
高等教育出版社,2006.
[6]施莱尔.OpenGL编程指南[M].王锐,译.8版.北京:
机械工业出版社,2004.
附录
1.ui_sec.h
#ifndef UI_SEC_H
#define UI_SEC_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
class Ui_sec {
public:
QLabel *label;
QLineEdit *lineEdit;
QPushButton *pushButton;
QPushButton *pushButton_2;
QPushButton *pushButton_3;
QLabel *label_2;
QLabel *label_3;
QPushButton *pushButton_4;
void setupUi(QDialog *sec) {
if (sec->objectName().isEmpty())
sec->setObjectName(QStringLiteral("sec"));
sec->resize(376, 282);
label = new QLabel(sec);
label->setObjectName(QStringLiteral("label"));
label->setGeometry(QRect(80, 40, 191, 121));
lineEdit = new QLineEdit(sec);
lineEdit->setObjectName(QStringLiteral("lineEdit"));
lineEdit->setGeometry(QRect(20, 190, 113, 21));
pushButton = new QPushButton(sec);
pushButton->setObjectName(QStringLiteral("pushButton"));
pushButton->setGeometry(QRect(20, 60, 31, 101));
pushButton_2 = new QPushButton(sec);
pushButton_2->setObjectName(QStringLiteral("pushButton_2"));
pushButton_2->setGeometry(QRect(310, 60, 31, 101));
pushButton_3 = new QPushButton(sec);
pushButton_3->setObjectName(QStringLiteral("pushButton_3"));
pushButton_3->setGeometry(QRect(30, 230, 93, 28));
label_2 = new QLabel(sec);
label_2->setObjectName(QStringLiteral("label_2"));
label_2->setGeometry(QRect(70, 10, 72, 15));
label_3 = new QLabel(sec);
label_3->setObjectName(QStringLiteral("label_3"));
label_3->setGeometry(QRect(20, 10, 72, 15));
pushButton_4 = new QPushButton(sec);
pushButton_4->setObjectName(QStringLiteral("pushButton_4"));
pushButton_4->setGeometry(QRect(210, 220, 121, 31));
QWidget:
:
setTabOrder(lineEdit, pushButton);
QWidget:
:
setTabOrder(pushButton, pushButton_3);
QWidget:
:
setTabOrder(pushButton_3, pushButton_4);
QWidget:
:
setTabOrder(pushButton_4, pushButton_2);
retranslateUi(sec);
QMetaObject:
:
connectSlotsByName(sec);
} // setupUi
void retranslateUi(QDialog *sec) {
sec->setWindowTitle(QApplication:
:
translate("sec", "Dialog", 0));
label->setText(QApplication:
:
translate("sec", "TextLabel", 0));
pushButton->setText(QApplication:
:
translate("sec", "<", 0));
pushButton_2->setText(QApplication:
:
translate("sec", ">", 0));
pushButton_3->setText(QApplication:
:
translate("sec", "\344\277\256\346\255\243(&C)", 0));
label_2->setText(QApplication:
:
translate("sec", "TextLabel", 0));
label_3->setText(QApplication:
:
translate("sec", "\345\272\217\345\217\267:
", 0));
pushButton_4->setText(QApplication:
:
translate("sec", "GenerateExcel", 0));
} // retranslateUi
};
namespace Ui {
class sec:
public Ui_sec {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_SEC_H
2.ui_widget.h
#ifndef UI_WIDGET_H
#define UI_WIDGET_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
class Ui_Widget {
public:
QPushButton *pushButton_2;
QWidget *horizontalLayoutWidget;
QHBoxLayout *horizontalLayout;
QLabel *label;
QLineEdit *lineEdit;
QPushButton *pushButton;
QPushButton *pushButton_3;
void setupUi(QWidget *Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName(QStringLiteral("Widget"));
Widget->resize(444, 191);
pushButton_2 = new QPushButton(Widget);
pushButton_2->setObjectName(QStringLiteral("pushButton_2"));
pushButton_2->setGeometry(QRect(170, 140, 93, 28));
horizontalLayoutWidget = new QWidget(Widget);
horizontalLayoutWidget->setObjectName(QStringLiteral("horizontalLayoutWidget"));
horizontalLayoutWidget->setGeometry(QRect(30, 30, 391, 61));
horizontalLayout = new QHBoxLayout(horizontalLayoutWidget);
horizontalLayout->setSpacing(6);
horizontalLayout->setContentsMargins(11, 11, 11, 11);
horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
horizontalLayout->setContentsMargins(0, 0, 0, 0);
label = new QLabel(horizontalLayoutWidget);
label->setObjectName(QStringLiteral("label"));
horizontalLayout->addWidget(label);
lineEdit = new QLineEdit(horizontalLayoutWidget);
lineEdit->setObjectName(QStringLiteral("lineEdit"));
horizontalLayout->addWidget(lineEdit);
pushButton = new QPushButton(horizontalLayoutWidget);
pushButton->setObjectName(QStringLiteral("pushButton"));
horizontalLayout->addWidget(pushButton);
pushButton_3 = new QPushButton(Widget);
pushButton_3->setObjectName(QStringLiteral("pushButton_3"));
pushButton_3->setGeometry(QRect(30, 140, 71, 31));
retranslateUi(Widget);
QMetaObject:
:
connectSlotsByName(Widget);
} // setupUi
void retranslateUi(QWidget *Widget) {
Widget->setWindowTitle(QApplication:
:
translate("Widget", "Widget", 0));
pushButton_2->setText(QApplication:
:
translate("Widget", "\345\210\206\346\236\220", 0));
label->setText(QApplication:
:
translate("Widget", "\346\211\223\345\274\200\346\226\207\344\273\266", 0));
pushButton->setText(QApplication:
:
translate("Widget", "\351\200\211\346\213\251\346\226\207\344\273\266", 0));
pushButton_3->setText(QApplication:
:
translate("Widget", "pathset", 0));
} // retranslateUi
};
namespace Ui {
class Widget:
public Ui_Widget {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_WIDGET_H
3.Sec.h
#ifndef SEC_H
#define SEC_H
#include
#define PY_SSIZE_T_CLEAN
#include
class QErrorMessage;
namespace Ui {
class sec;
}
class sec :
public QDialog {
Q_OBJECT
public:
explicit sec(QWidget *parent , PyObject *NumList1);
~sec();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
private:
Ui:
:
sec *ui;
int NowSrcNum;
int MaxSrcNum;
PyObject *NumList;
QErrorMessage * errordlg;
void ShowNum();
void SetNum();
void FlashSrc(int FileName);
protected:
void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event);
};
#endif // SEC_H
4.Widget.cpp
#ifndef WIDGET_H
#define WIDGET_H