接着上篇博客的鼠标滚轮事件之后,本次要完成的是基于结构体的变量管理以及如何让参数与界面进行关联。
---------------------------------1、下面实现的是变量管理----------------------------------
基于结构体的变量管理:
个人习惯:在写结构体时单独去写一个文件,起名为公共部分,(这个部分就可以把需要用到的结构体或者define变量,就是每一个成员都可能会用到的变量都可以放在这里 )
添加---->Add New---->C++,此时可以添加.h文件或者一个类(因为添加类的话.h和.cpp文件你都会包含了,只需要把添加的类构造函数的代码删除掉就可以因为我们不写类,作为普通的.h和.cpp文件来使用了)
把上述对应的代码删除掉,因为我们不写类。
结构体的写法一共有4种方式,选择自己最熟悉的写结构体的方式即可。
下面如果有变量要使用的地方就要使用结构体.的方式来使用变量。
---------------------------2、下面进行自动加载和保存参数----------------
自动加载和保存参数就是比如本次我们已经修改了参数,比如参数灰度值,下次再使用的时候我们不想再去修改了,就是修改一次之后想保存本次记忆,下次开机自动就是保存上次的参数。这样每次就不用去修改了。想实现这样的功能,我们使用的是QSetting的方法。
下面以二值化的灰度阈值进行记录:
首先在界面上添加参数按钮:二值化最小阈值和二值化阈值最大值。
(基于上次界面的基础上,在ui上先把布局打破,然后复制一下打开图像和计数的按钮-----复制粘贴是偷懒式的建立按钮方式。)
之后进行转到槽操作,因为此处是int型,所以选择int的ValueChage(int)。
下一步就是转到槽内函数的封装:
1、先在公共头文件定义一个结构体进行变量的管理。(就是上一步的变量管理)
2、定义结构体之后使用结构体声明变量。
PramSave PramS;
3、变量在函数中的使用
(1)首先头文件中引入QSettings的头文件。
是QT特有的一个类。 用来保存或读取一些配置信息用的。
具体代码如下:
//最小阈值管理的槽
void QtCircleLocation::on_sB_MinThreshold_valueChanged(int arg1)
{//参数处理与保存(1、首先定义一个结构体管理参数)//1、给变量赋值PramS.MinThreshold=arg1;QString group;QString key;QVariant value;//赋值group="main";key="MinThresholdValue";value=QVariant(arg1);//对value进行强制转化一下//2、保存一个值到我本地文件(使用Qsetting的方法 )QSettings setting(qApp->applicationDirPath()+"/mysave.ini",QSettings::IniFormat);if(group.size()!=0){setting.beginGroup(group);}setting.setValue(key,value);if(group.size()!=0){setting.endGroup();}
}
打开这个mysave.ini文件:
main是一个小组,小组里边有一个成员名称是ThresholdValue,值为4(就是键值对key----value)。
下面是对于最大值MaxThreshold转到槽的操作:同上。
把上述红框里边的代码封装为一个公共函数,放在公共部分(就是大家都会用到的)。
保存模式:
封装模式:头文件中声明,源文件中定义。(函数声明与函数定义里边参数的类型必须一样,名称可以不一样)
声明:
定义:
函数调用:
加载模式:
加载函数的声明与定义仍然放在公共部分,但是加载函数的调用放在构造函数里边,构造函数里边是程序一启动就会加载。
加载参数(加载是需要将参数输出的,输出的话这里使用的是引用的方法)
函数声明:
函数定义:
函数调用:
最终当你再次运行代码的时候就会记录你上次使用的参数:
下面就界面修改的灰度阈值生效,就需要在处理函数中修改一下:
首先在处理函数里边引用在外部cpp定义的变量:(这里就不再定义,直接使用extern使用就行)
选编在二值化里边的函数修改一下,由原来的的固定值0和171修改为 PramS.MinThreshold和PramS.MaxThreshold。
最终结果:
最终的完整代码见链接:
https://download.csdn.net/download/m0_37957160/20688257