(二)现场检测项目 工控机 服务器将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
    评论
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行次开发。在使用过程,如有问题或建议,请及时沟通。 5.期待你能在项目找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于Qt、C和C++开发的工控行业组态软件ICStudio源码+项目说明.zip 基于Qt的工控行业组态软件ICStudio 次开发平台 没考虑多语言 开发环境 Qt5.13 + msvc1027 项目后续通过插件进行扩展:数据插件,自定义控件插件,业务插件 数据插件:默认存在一个本地数据插件,数据插件分为-地址类型和标签类型,地址类型比较常见的有通讯协议比如Modbus等,标签类型的比如CIP协议 自定义控件插件:UI控件 业务插件:扩展业务处理,扩展系统功能 1.分为编辑模式和运行模式 编辑模式下: 1.可配置前端UI显示配置绑定数据心的变量 2.提供变量绑定UI控件的属性,变量发生变化自动触发到绑定属性的控件 3.变量可绑定外设的通讯地址也可以绑定本地地址 外设目前增加到了modbus 运行模式下: 1.无操作的情况下,UI主要通过数据心驱动,控件刷新&画面切换等等 控件: 1. 可直接按照框架提供的方案直接封装使用qt提供的qwidget通用控件 2. 可直接自己开发绘制控件,基于qwidget 3. 控件刷新一键绑定数据心变量,运行时直接通过数据心驱动刷新显示
### 回答1: Qt是一种跨平台的应用程序框架,可以帮助开发者快速创建图形用户界面,同时提供丰富的库,方便开发者处理各种数据和实现各种功能Qt还支持多语言、多风格、可扩展性等特性,使得其广泛应用于各种领域,特别是在工控和上位机方向上得到了广泛的应用。 针对工控和上位机领域的特殊要求,Qt提供了一系列特定的库和组件,使得其可以很好地支持实时数据交互、界面定制、图表显示和远程监控等功能。同时,Qt通过与C++、Python等编程语言的兼容性,使得工控和上位机的开发过程更加高效和灵活。 CSDN作为国最大的IT技术交流社区,也是Qt和工控领域的交流平台之一。在这里,开发者可以分享经验、学习最新技术,改善交互界面和提高应用程序的性能。同时,CSDN也是一个极好的教程网站,能够为初学者提供大量的学习资源和实用案例,促进工控和上位机应用的发展。 总之,Qt、C、工控、上位机和CSDN之间形成了一条紧密的关联链,共同助力工业自动化和信息化建设的不断进步和发展。 ### 回答2: Qt是一种跨平台的GUI(图形用户界面)应用程序开发框架,可以用C++编程语言编写。Qt框架包括了C++类库和各种工具,可以帮助开发人员快速地创建高性能的、美观的桌面应用程序、移动应用程序和嵌入式系统应用程序Qt的设计理念是面向对象、易于学习和使用、代码重用性高、具有良好的可扩展性和可维护性等优点。 工控上位机是工业自动化控制系统的重要组成部分,一般由硬件设备和软件系统构成。硬件设备一般用来采集现场信号、执行控制命令等,软件系统则是通过上位机处理采集到的数据、实现控制策略、监控生产过程等。在工控上位机Qt框架可以用来实现图形界面的开发、数据可视化展示、通信协议的支持等功能。由于Qt框架支持跨平台开发,所以工控上位机的开发可以更加普及和便捷。 CSDN是一个面向程序员的IT社区,提供了全面的技术资讯、实战经验、源代码下载、技术论坛等服务。在CSDN的平台上,Qt框架的开发者可以分享自己的经验、技巧和成果,与全球开发者交流互动,不断提升自己的编程水平。同时,Qt框架也得到了CSDN技术社区的广泛认可和推广,更多的开发者开始使用Qt来开发工控上位机等应用程序,促进了工业智能化的进一步发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小都爱吃小橘子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值