一、需求描述:

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. Frequent Pattern 挖掘之一(Aprior算法)(转)

    数据挖掘中有一个很重要的应用,就是Frequent Pattern挖掘,翻译成中文就是频繁模式挖掘.这篇博客就想谈谈频繁模式挖掘相关的一些算法. 定义 何谓频繁模式挖掘呢?所谓频繁模式指的是在样本数据 ...

  2. css动画结束后 js无法修改translated值 .

    由于项目的需要,俺要做一些页面的转场动画. 即将是移动端,肯定是首先css动画了. 结果确发现,css动画中,如果设置animation-fill-mode: both;在动画结束后无法个性trans ...

  3. php错误处理和异常处理

    PHP错误处理有两种:标准的错误处理和异常(OOP语法新出现的错误处理机制)

  4. ASP.NET MVC 自我总结的便捷开发实例

    前言 工作了这么久了,接触ASP.NET MVC已经很久了,一直都想总结一下它的一些实用的,经常使用的一些技巧,但是因为一直都很懒,也不想总结,所以一直都没有好好写出来,趁着现在有这种冲劲,那么就先把 ...

  5. C#中volatile的用法

    恐怕比较一下volatile和synchronized的不同是最容易解释清楚的.volatile是变量修饰符,而synchronized则作用于一段代码或方法:看如下三句get代码: int i1;  ...

  6. C#获取数组的行和列数程序代码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  7. Java中报错No enclosing instance of type caiquan is accessible. Must qualify the allocation with an enclosing instance of type caiquan (e.g. x.new A() where x is an instance of caiquan).

    package test;import java.util.Scanner;import java.util.Random;public class caiquan { public static v ...

  8. 理解java Web项目中的路径问题

    本文以项目部署在tomcat服务器为例,其他相信也是一样的. 先说明请求页面的写法,在web中,页面路径主要写的有以下几种 1.请求重定向 2.浏览器的请求被服务器请求到新页面(我称为“转发”) 3. ...

  9. 批量缩放PNG图片.

    最近需要缩放N多图片, 找遍了互联网也没有找到方便使用的批量缩放工具.. 趁着周末写一个练手.. #include <iostream> #include <vector> # ...

  10. node初步二 小爬虫

    小爬拉勾网 获取想要的信息: 一.分三步 1 获得数据 2 处理数据 3展示数据 二 .代码 :创建文件reptile.js;写入 var http=require('http'); var chee ...