一、需求描述:

1、读取data.asc文件,分析其连续性;

2、绘制信号图像,并保存。

二、UI界面组成:

该应用的UI由以下几个控件组成:

3个PushButton:打开文件、图像保存、退出;

1个Combox:下拉框用于信号的选择;

1个Widget:用于确定绘图区域的坐标,并在Widget部件上绘制图像曲线。

3个Label:用于标注注释,及坐标轴

三、主要功能的实现

信号分析结果如下:

其中最主要的涉及信号数据的标准化处理,标准化处理计算公式:

std=(当前信号值—此类信号的最小值)/(此类信号的最大值—此类信号的最小值)

1、坐标轴的绘制

void Dialog::paintEvent(QPaintEvent *event)//重绘事件处理函数的定义   实现绘制坐标轴函数
{
QPainter painter(this);//创建一个QPainter对象,this为绘图设备 QPoint wpostion = ui->widget->pos(); //当前窗体Widget的原点的位置,weight的左上角处(0,0)点
QSize wsize = ui->widget->size(); //Ui窗体当前的大小(宽 高) //设置坐标轴点的坐标
int x1=wpostion.x()-; //0-1
int y1= wpostion.y()+ wsize.height()+ ; //0+高+1 //创建画笔P212 设画笔使用颜色 线宽 画笔风格 画笔端点风格 画笔连接风格
QPen pen(Qt::blue,,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
//使用画笔
painter.setPen(pen); //绘制坐标轴
painter.drawLine(x1,y1,this->width()-,y1);//绘制横轴 时间轴
painter.drawLine(x1,wpostion.y(),x1,y1);//绘制纵轴 信号值轴
}

2、文件打开功能实现

void Dialog::on_filepushButton_clicked()  //打开文件按钮函数的定义  实现文本文件的读取
{ QString fileName = QFileDialog::getOpenFileName(this, tr("文件打开对话框"),"D",
tr("文本文件(*.txt);;ASC文件(*.asc)"));
//使用QFileDialog类中的getOpenFileName()函数获取选择的文件名 返回选择的文件的文件名
//参数定义 指定父窗口 设置对话框标题 指定打开目录路径 文件类型过滤器
QFile file(fileName);//创建一个QFile类对象, //然后以只读的方式打开
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
return;
} int rownum=;//第一行行号为0
for(int i=;i<;i++)//16列初始化
data[i].clear(); QTextStream in(&file);//一行一行的读取一个文本文件
while(!in.atEnd())
{
QString fileLine=in.readLine(); //读取到每一行的字符串 //p327 对分行读取的字符串进行处理
QStringList sl=fileLine.split(" ",QString::SkipEmptyParts);//字符串分割 将分割后的字符串放入组表中
rownum++;//行号加1 int i=; //第i列 //将每一行的各个元素 分别放入每一列对应下的数组内
for(QStringList::const_iterator it=sl.constBegin();it!=sl.end();it++,i++) //it每行字符组的个数
{
data[i].push_back((*it).toFloat()); //将字符串转换成浮点数据写入数据容器内
}
}
ui->comboBox->setCurrentIndex(); //下拉框当前值值第一列
}

3、图像保存功能

void Dialog::on_pushButton_2_clicked()//实现图像保存
{
QPixmap pixmap;//定义一个pixmap图像
pixmap=pixmap.grabWindow(QApplication::desktop()->winId(),pos().x(),pos().y(),frameGeometry().width(),frameGeometry().height());
//grabWindow可以实现将屏幕上的窗体保存成一个QPixmap格式的图片
pixmap.save("D:\\picture.jpg","JPG");//将截取的窗体图像保存到E盘并以JPG格式保存
}

4、退出按钮的实现

void Dialog::on_pushButton_clicked()//退出当前窗口
{
this->close();
}

5、曲线绘制事件

void Widget2::paintEvent(QPaintEvent *event)//重绘事件处理函数的定义 在widget部件上绘制曲线
{ //信号值y值 接收
if(m_data==NULL) return;
QVector<float>& data = *m_data; int r=;//初始化行坐标为0
const int rnum=data.size();//每一列信号的值的个数 即行号
if(rnum==) return; //如果当前没有信号值 返回 //信号值找最大值最小值的过程
float min,max;
min=max=data[];
for(int i=;i<rnum;i++)
{
if(data[i]>max) max=data[i];
if(data[i]<min) min=data[i];
} //数据标准化过程 x=(x-min)/(max-min)*height
const float wheight=this->height();
/*while(max!=min)
{
for(int j=0;j<rnum;j++)
{
data[j]=(data[j]-min)*wheight/(max-min);
}
}
for(int j=0;j<rnum;j++)
{
if(max=min)
{
data[j]=wheight/2;
}
else
{
data[j]=(data[j]-min)*wheight/(max-min);
}
}*/ //设置路径path的过程 P230
QPainterPath path;//定义一个path对象
//曲线当前点
path.moveTo(r,max!=min?((data[r]-min)/(max-min))*wheight:wheight/);
//曲线目标点 即下一个点 下一个点自动变成当前点
for(r=;r<rnum;r++)
{
path.lineTo(r,max!=min?((data[r]-min)/(max-min))*wheight:wheight/);
} //绘制曲线的过程
//指定绘图设备
QPainter painter(this);
//创建画笔P212 设画笔使用颜色 线宽 画笔风格 画笔端点风格 画笔连接风格
QPen pen(Qt::red,,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
//使用画笔
painter.setPen(pen);
//将坐标系统进行平移 平移到起始点位置
painter.translate(, this->height());
//将坐标系统进行缩放
painter.scale(,-);
//绘制当前路径
painter.drawPath(path); }
 

基于Qt的信号分析简单应用软件的设计的更多相关文章

  1. 【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示

    本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选 ...

  2. 【Qt编程】基于Qt的词典开发系列&lt;八&gt;--用户登录及API调用的实现

    在上一篇文章<调用网络API>中,我仅仅讲述了怎样直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用.当然本程序的实现也是借助于扇贝网的API接口文档 ...

  3. 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计

    本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...

  4. 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计

    这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...

  5. 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计

    我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...

  6. 【Qt编程】基于Qt的词典开发系列<五>--无边框窗口的拖动

    在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口 ...

  7. 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动

    在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...

  8. 【Qt编程】基于Qt的词典开发系列--后序

    从去年八月份到现在,总算完成了词典的编写以及相关技术文档的编辑工作.从整个过程来说,文档的编写比程序的实现耗费的时间更多.基于Qt的词典开发系列文章,大致包含了在编写词典软件过程中遇到的技术重点与难点 ...

  9. 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示

    去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...

随机推荐

  1. RedHat7安装Nginx及第三方模块

    编译安装Nginx 先安装编译过程中所需依赖包# yum -y install gcc pcre-devel openssl-devel zlib-devel jemalloc(更好的内存管理)# w ...

  2. python 函数初识和文件操作

    文件操作  打开文件:文件句柄 = open('文件路径', '模式')  打开文件的模式 w #以写的方式打开 (不可读,不存在则创建,存在则删除内容) a #以追加的模式打开(可读, 不存在则创建 ...

  3. Java获取项目路径

    参考博客.自己就不写了.我觉得他写得很详细 http://blog.csdn.net/hpf911/article/details/5852127

  4. SQL SERVER 高级编程 - 自定义函数 拾忆

    每个人都很忙,但是花10分钟复习下,总结下基础东西还是很有益处的. 背景: 总结一句,使用简便,还能递归,是的SQL更简洁,相对比一大堆的关联语句,而且关联一大堆还不一定实现特定功能.而且共用部分可以 ...

  5. Visual 2012 常用快捷键

    快捷键 功能说明 Crtl+K,Crtl+C 注释光标所在行,或选中行 Crtl+K,Crtl+U 反注释光标所在行,或选中行 Crtl+K,Crtl+F 格式化全文 F12 转到定义 Shift + ...

  6. $(obj).data() 绑定和获取数据的应用

    1.解说 data() 方法向被选元素附加数据,或者从被选元素获取数据. 例如:$("#id").data("name","xiao"); ...

  7. Object-C — KVO & oc通知

    键值观察(KVO)是基于键值编码的一种技术. 利用键值观察可以注册成为一个对象的观察者,在该对象的某个属性变化时收到通知. 被观察对象需要编写符合KVC标准的存取方法,编写键值观察分为以下三步: (1 ...

  8. Swift基础知识入门(基于Swift2.0)

    //: Playground - noun: a place where people can play import UIKit // Swift中不需要设置main函数入口,编译器会在全局函数中自 ...

  9. html-----004

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 数据库(学习整理)----2--关于Oracle用户权限的授权和收权

    知识点: 1.Oracle数据库中所用的用户等级是平级的!只是每个用户的权限不同而已! 2.在一个用户登录后,可以在自己的登录状态下访问其他用户的数据缓冲区.表.以及表的操作!(只要该用户用权限!) ...