(二)现场检测项目 工控机 服务器将MFC功能程序移植到QT5的c++上(持续更新中...)

MFC和QT完全不一样,本文章持续更新中,将所有技术都在本文章体现,杂七杂八的多,推荐搜索,文章不但有干货,还有猫捉老鼠的精彩好戏

2022.4.7  摸鱼的开始

功能:读取plt文件,将文本读取到QSTring中

疑问:为什么是Qstring,而不是Qlist容器之类的

解答:容器不会用,找不到例程(我太菜了),反正是读取某一个点,如果后续需要容器,加个容器append进去

    QFile file("C:\\Users\\Administrator\\Desktop\\djjtest.plt");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QString fileData = file.readAll();
for....
    readData = fileData.mid(seek, 1).at(0).unicode();//mid是截取,at是qstring转char

2022.4.8

iXt=(float)sParm[ia].toFloat();  //Qstring转float

数学函数包含头文件

#include <QtCore/qmath.h>

tanh() //双曲正切

fabs() //处理double类型的取绝对值

fabsf() //处理float类型的取绝对值

memset 一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化

mfc的CArray <LineF, LineF> m_Lines;

数组第一个参数就是CArray类数组元素的变量类型,后一个是函数调用时的参数类型,转换为qt中就是用QList <LineF> xxx,一个参数

写到一半被导师叫去看完整的MFC工程了,然后好(bei)好(bi)使(wu)用(nai)使用了github备份,要问我怎么用?我看他的教程Github Desktop使用教程 - 林一诺 - 博客园 苦恼 你有没有为了学git的经历一而再再而三查看别人的文档还是学不会的经历,只是它、因为你没有使用git的需要,更何况繁琐的命令行让人头疼,什么缓存区,分支,HEAD,合并分支这些让人头疼的东西敬而远https://www.cnblogs.com/qq291035606/p/10612796.html过程中看到了 MFC的XTRACE,也就是debug时候print

看了网上教程 在.pro中加入

DEFINES+= QT_NO_DEBUG_OUTPUT

但是我尝试没啥用(可能我是菜狗),但是我找了另一种方法

主程序里面加入 
#include <QLoggingCategory>
QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, false);

这个false改成true就是可以输出正常使用qDebug()

4.10

大废物的一天,从matlab开始。昨天该死的数据出了问题,ccd某几帧突然饱和了,然后又恢复正常了,叫我用matlab作图看看,不太会用,想用excel,发现导入卡死,还是乖乖用matlab

函数  plot 画图               程序是抄别人的 copy大法好啊

load('onlyA.mat'); //导入文件,这里有bug,不是网上说的那种引号问题,而是注释!!!!!不知道为什么不支持有注释

figure(2);  //建立第2号图表

x = onlyA(1:2000,1000);  //取onlyA中第1000列数据2000个

set  //那就set呗,设置一堆乱七八糟的东西

axis([xmin xmax ymin ymax])   设置xy轴

t=(0:0.1:1)
那么t就是[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]

终于被我看到了bug数据了,突然ccd采集上来的莫名其妙的饱和数据

close all;

clc;
close all;
load('onlyA.mat'); 

x = onlyA(1:2000,1000);  

t = 0:0.02:40-0.02;  

figure(2);
plot(t, x,'b');
set(gca,'FontName','Times New Roman','FontSize',9);
xlabel('time(s)'); ylabel('Tracking errors');
set(gca,'FontName','Times New Roman','FontSize',9);
set(gcf, 'unit', 'centimeters', 'position', [10 5 8 4.2])

axis([0 40 -0.4 4]);
set(gca, 'YTick', [-0.4:0.2:4])
h=legend('$x_e$', '$y_e$');
set(h,'Interpreter','latex'); grid;

grid;

 换了几个数据点,看着好像有规律。好了,刚刚某人一个电话,骂了一顿,然后原始数据给他了,我现在摸个鱼 

现在中途玩了会失落的城市,然后某人的matlab亲自搞,看着就贼牛逼,好吧是我太菜了,只需要加入这几行就行

col = size(B21,2); %返回的时数组xxx的列数
x= 1:1:col;
y = B21(:,1:end); 
fprintf('x=%d\n',x);

4.11

摸鱼记录没了,算了,出现了bug,是上一个项目的ccd,不想多说,继续解决adc不准的问题

直接接电源莫名其妙会出现0.00000v,要是是ccd会有突变,那么问题就在adc时序,可能垃圾杜邦线的问题ccccccccc。

现在已经肝了12小时了,发现,是某人写的fpga那块ad9822驱动有问题,wlgc,怎么改?有木有人和我交流交流

4.12

菜b学 matlab 读取前 i 行,前 j 列。键入a( 1:i,  1:j)    其中括号内,行列以逗号隔开,逗号前的控制行,逗号后的控制列就行

捞了几帧,发现有bug,开始躺平了,不知道怎么解决,没脑子了。

刚刚写完以上的,在看勇敢的心,看完一集休息了一下,导师来了!!!!!搞得我很狼狈,好了经过一番操作,发现实验室示波器和信号发生器没一个好的哈哈哈哈,然后各种调试,最后弄出来了一个好的点。好了这个项目还是没思路,换个口味。搞C++ QGraphicsScene

现在又是晚上9点,搞了12小时,能在这个场景scene里面加入了按钮,这个demo很简单,明天解释具体的程序,因为要搞3个场景,还要弹窗隐藏另一个,按钮输入,明天加油搞,加油打工人

4.13

浅浅做个计划吧,因为之前ccd项目遇到了超级考验人的难题,因为结论太多太矛盾了,那么列计划做事情

首先表明问题:4.10号那图,采集一帧有突然饱和的情况

其次提出假设:1ccd时序,2信号线因为是杜邦线,3ad转换器硬件,4ad软件

再次表明态度:ad采集软件比较好做,其他太难改了,那么我采集正弦波sinx函数,看看有没有毛刺

验证4的结论:

sin1k1vccd1000hz:
第10帧必然是>0.4v,大波形中间有毛刺,采集会偏移,峰峰值是0.1V
sin1k1vccd1000hzA:
a通道和b通道一样

采集这个样本的时候,我没有拔电,是直接下载500hz的
sin1k1vccd500hzA
没有了>0.4v的,毛刺还有,偏移还有,峰峰值比较奇怪,有些是0.1v有一些是0.2v
就是一堆0.2v的之后出现0.1v,还有感觉很平平的线
重新采集

和上述情况一样,但是发现从60帧开始,本来是sin,下一帧采集突然变成一条直线,之后恢复,然后到了92帧又出现这样的情况,然后出现0.1v的sin

newboard1000hz 
newboard500hz
换成有散热硅脂的板子
500hz现象还在
1000hz和500hz一样,这里与之前的矛盾,突然变直线,然后突然恢复,也不是从某一帧开始,可能从中间

重新看之前的,是之前看少眼了

信号发生器sin换成都是正的,
1khz下有0.1vpp,但是会有0.1v的噪点
变正常了,很正常很正常的sin波

再次做了,用了1vpp的,还是这样的有杂波
总结:pcb上有干扰,ad软硬件没问题,可能是ccd软硬件的问题

没管我一天了,放养的可怕,最可怕就是温水煮青蛙,开始搞qt,从0开始学c++

写一个新的class类报错 C++ undefined reference to `vtable for xxxx,原因是父类指针是虚的,所以要在新建ceshi.cpp 和ceshi.h中加东西

cpp:   ceshi::ceshi(QObject *parent) : QObject(parent)

h:class的中 public: explicit ceshi(QObject *parent = 0);

最后

#include <QObject>

这样才能用信号与槽,搞了一个晚上

QGraphicsScene管理QGraphicsItem(单击和移动和删除已经实现)

中间遇到了不少的坑,scene中信号与槽的qpushbutton没法嵌入,然后呢widget嵌入scene中也是没法,最后用了scene点击item事件解决的

qt移动

4.14

原谅我不太会用QT和c++,目的:一个界面上面有切换界面,隐藏界面。graphicscene上本来想弄个大的class,然后调用这个class进行隐藏啥的,结果弄了大半天不行,现在准备弄自动生成item个数,验证失败,好了现在又搞回widget嵌入graphic中,依旧搞失败,那么还是回到昨天那个可以拖动的在那个上面隐藏吧

Cannot retrieve debugging output,原因是开了好几个qt在调试

在好几个函数对一个对象操作,CustomScene.h文件中这样加入,就可以使用myscene这个了,解决了套娃问题,然后劳资的研究生管理系统登不上去了可恶啊

private:   CustomScene *myscene =this;

然后就可以愉快使用

myscene->addItem(pItem1) ; 和   myscene->removeItem(pItem1);

干货时间刚刚导师亲自指导我这个小菜比:有个东西叫做电路反射,也就是说正常的信号走过pcb,由于某些地方的阻抗突变,导致会自激振荡,然后恢复,这是由于反射引起的。这时候需要终端电阻来加偏置,图中黄色的线是抓出来的波形

4.16

调试了一个上午,发现波形在平稳的时候有起伏,就是在有光的地方,它会有波动,分析了ab路的原因,也分析了,可能是接触不好,也可能是没用示波器看波形,后来花了很多时间是因为之前我用示波器看的时候,焊接了一根天线,然后把它去掉以后我忘记开电源,在弄排线。
这个就是调试方法的问题了,发现问题应该是思考,而不是马上排除,然后把调试的环境全部都弄好,先简单的看一遍再弄花时间的,这样子踩的坑就会少很多

4.18

心情不好了两天,教资依旧没过,难受死了。之后不怎么更新了

graphic scene和graphic view ,我都没法实现屏蔽和新建,但我发现了一个组group,可以利用hide和show进行操作

把item(比如矩形)加入组中,然后用组显示,组可以隐藏啥的,就是实现了一起屏蔽一起操作,不用Qlist麻烦

QGraphicsItemGroup *itemgroup = new QGraphicsItemGroup;
itemgroup->addToGroup(item);
addItem(itemgroup);
itemgroup->hide();

4.19

今天遇到三个问题:

1:IntelliSense:  表达式必须含有常量值

方法,使用动态内存


    //double refSig[imgWidth] = { 0 };           // 相关像(参考信号)
    double *refSig = new double[slitPixI];    //用了动态内存

2:c++库的未定义标识符:

加了头文件,并且把路径加入还是报错,因为没用下面这句话

using namespace std;

3:恒流源电流为0

电阻一定要小,不然太大了都吸收走了

4.21

QListWidget是一个升级版本的QListView,它已经自己为我们建立了一个数据存储模型(QListWidgetItem),操作方便,直接调用addItem即可添加项目(ICON,文字),而QlistView就要自己生成了


    ui->listWidget->insertItem(0,tr("hello"));
    ui->listWidget->insertItem(1,tr("hi"));
//前两行是插入两行数据
ui->listWidget->currentItem()->text();//获取选中的文本的text值

ListView 到此为止啦,接下来是表格

//表格的信号与槽

    //编辑完成后触发cellChanged信号
        connect(ui->tableWidget,&QTableWidget::cellChanged,[=](int row,int column)
                    {
                        qDebug() <<tr(" row = ") << row << tr(" column = ")<< column << ui->tableWidget->item(row,column)->text();
                    });
        
    //点击触发cellChanged信号
            connect(ui->tableWidget,&QTableWidget::cellClicked,[=](int row,int column)
                        {
                            qDebug() <<tr(" row = ") << row << tr(" column = ")<< column << ui->tableWidget->item(row,column)->text();
                        });


//动态添加行
int row = ui->tableWidget->rowCount();//动态添加行
        ui->tableWidget->insertRow(row);

//正常操作
ui->tableWidget->setItem(nRow,nColumn++,pItem);  //设置第1列内容
//设置行数
        ui->tableWidget->setRowCount(1);
        //设置列数
        ui->tableWidget->setColumnCount(9);
//设置表头
        QStringList strList;
            strList <<tr("参数名")<< tr("参数值");
            ui->tableWidget->setHorizontalHeaderLabels(strList);

4.25

今天搞了qt在widget画图,发现一个UI中只能这样触发Qpaint画笔,而我一些坐标文件在其他子函数中,子函数在这里调用发现不行,只能另辟蹊径,好在,其他坐标是生成,这里把单独绘制的子函数拉出来实现即可

void Form2::paintEvent(QPaintEvent *)

白天一直在找画不出图的原因,首先找了是不是CArray的问题,换成了qt从qlist到queue,发现queque使用Qqueque的,就是个FIFO,不支持查找,放弃,然后换成了Vector,和list一样,怎么可能!!!当然list是堆栈,vector是内存,有快慢区别,好了,现在发现了可能是QPoint 的问题,里面的变量我用了个for循环后刷新不出,直接给是可以的。其中a1234是最下面的值,很奇怪用了for就不行了

4.28

给了我一个新考验,搞了一天搞不出来,放弃了。我是要在widgit中放入scroll缩放框,然后在scroll中用painter画线,那么scroll中可以嵌套新的widgit,这么一看没啥问题,问题就在于放到一起,画线必须在虚函数事件中实现,但是由于是嵌套一个scroll,就没法容易的写,那么重新创一个类可不可以呢,答案是可以的。实现比较复杂。具体是这样的

main调用widget,widget的ui中创建一个scroll,以这个widget为父类,新写一个subwidget类cpp,在widget中调用以scroll为父类创建,在subwidget中调用画笔就ok了

 
private:

    QScrollArea *scrollArea;
    QWidget *mywidget;
    QLabel *myLabel;
    QPainter *mypaint;
    Ui::Widget *ui;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    scrollArea = new QScrollArea(this);//基于父容器创建的一个滚动区域
    subWidget = new SubWidget(scrollArea);//基于scroll
    scrollArea->setWidget(subWidget);

}
//------------------------------------------------
void SubWidget::paintEvent(QPaintEvent* event) {


    QPainter painter(this);
    QPen pen;
    pen.setColor(Qt::blue);
    painter.setPen(pen);

    painter.drawText(10, 100, "This is subWidget");
    painter.drawLine(QPointF(0, 0), QPointF(100, 150));
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小都爱吃小橘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值