基于Qt的信号分析简单应用软件的设计
一、需求描述:
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的信号分析简单应用软件的设计的更多相关文章
- 【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示
本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选 ...
- 【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现
在上一篇文章<调用网络API>中,我仅仅讲述了怎样直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用.当然本程序的实现也是借助于扇贝网的API接口文档 ...
- 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计
本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...
- 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...
- 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计
我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...
- 【Qt编程】基于Qt的词典开发系列<五>--无边框窗口的拖动
在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口 ...
- 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动
在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...
- 【Qt编程】基于Qt的词典开发系列--后序
从去年八月份到现在,总算完成了词典的编写以及相关技术文档的编辑工作.从整个过程来说,文档的编写比程序的实现耗费的时间更多.基于Qt的词典开发系列文章,大致包含了在编写词典软件过程中遇到的技术重点与难点 ...
- 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示
去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...
随机推荐
- mysql-distinct去重、mysql-group …
一.MYSQL-distinct用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记 ...
- svn出错问题(用户名密码有修改以及资源url改变时)
用eclipse 同步SVN服务器宛然无法访问了: org.tigris.subversion.javahl.ClientException: RA layer request failed svn: ...
- Microsoft SQL Server 管理 (常用管理及维护命令)
--查询当前连接的实例名 select @@servername --察看任何数据库属性 sp_helpdb master --设置单用户模式,同时立即断开所有用户 alter database No ...
- C#当中的多线程_任务并行库(上)
复习: 第三章内容中我们提到了三种异步编程模型,这里简单复习一下,分别如下 1.APM(异步编程模式):形如Beginxxx,Endxxx. 2.EAP(基于事件的异步编程模式):这个我们在.net中 ...
- java - import *
以前看过很多视频,现在发觉很多讲师讲的有些地方是错的,在这里就说一下 import *,例如: import java.util.*的时候,表示的是将文件中使用到的类(而不是全部类)导入,例如在imp ...
- DropDownList绑定多个字段值
发觉这个问题还是挺多人问的,简单写几个例子: 假设现有1张表名为:XUDAXIA , 该表里有2个字段: NAME , GENDER 达到效果: 将这2个字段绑定到DropDownList的Lis ...
- hibernate逆向工程生成的实体映射需要修改
根据实际情况进行修改,主要2处,注释的位置<!-- 把catalog="platform"删掉 -->,<!-- 替换为native --> <? ...
- 枚举N行N列的自然数列
数据库环境:SQL SERVER 2005 现有一个需求,要枚举1-50个自然数,分10行5列展示.如图,
- Android增加监听的三种实现方式
在Android中,为一个按钮增加监听的方式有五种 1.匿名内部类 @Override protected void onCreate(Bundle savedInstanceState) { sup ...
- C++专题 - 修练8年C++面向对象程序设计之体会 林锐
六年前,我刚热恋“面向对象”(Object-Oriented)时,一口气记住了近十个定义.六年后,我从几十万行程序中滚爬出来准备写点心得体会时, 却无法解释什么是“面向对象”,就象说不清楚什么是数学那 ...