一、大量同类控件的初始化
如下图所示,【频率】、【Q值】和【增益】都有31个文本框需要设置,如果一个一个设置,不仅慢,代码也太冗长了。可以通过获取所有文本框的操作句柄,然后根据文本框的名称不同加以区分。
初始化代码如下:
//获取所有的QLineEdit控件操作句柄
QList<QLineEdit *> mInputEdits = ui->ControlPanel->findChildren<QLineEdit *>();
int tempindex=0;
foreach (QLineEdit *InputEdit, mInputEdits) {
//获取每一个QLineEdit控件的名称
QString TempNowStr=InputEdit->objectName();
//按照符号“_”进行分割
QStringList TempStr=TempNowStr.split("_");
//如果不是我们需要设置的QLineEdit控件,跳过
if(TempStr.count()<2)
{
//更新序号
tempindex=tempindex+1;
continue;
}
if(TempStr[1]=="PF")
{
//设置输入的范围限制
InputEdit->setValidator(new QDoubleValidator(0.0,5.0,6,this));
//InputEdit->setText("5");
}else if(TempStr[1]=="Q")
{
InputEdit->setValidator(new QDoubleValidator(0.0,5.0,6,this));
InputEdit->setText("2.515");
}else if(TempStr[1]=="Gain")
{
InputEdit->setValidator(new QDoubleValidator(-12,12,1,this));
InputEdit->setText("0.0");
}
//更新序号
tempindex=tempindex+1;
}
二、同属于一类对象的大量数据
当前,我需要解决如下的一个问题:
有一个曲线图,包含有1条显性主曲线和31条隐性类正态分布曲线(所谓的显性和隐性,指的是曲线是一直显示的,还是在拖动它的控制点时才显示)。显性主曲线是31条隐性类正态分布曲线之和。每条类正态分布曲线有3个控制点,控制点可以拖动,这3个控制点代表这条类正态分布曲线曲线的中心频率、Q值和增益。
如果离散的分别进行操作,虽然也能实现功能,但所有东西都是搅在一起的,且代码量肯定很大。这里使用一个类来理清关系。
2.1 EQ均衡曲线类
//EQ均衡曲线类
class EQcurve
{
Q_OBJECT
public:
EQcurve();
EQcurve(const EQcurve &other);
~EQcurve();
QVector<double> Xaxisdata; //X轴的数据
QVector<double> MainCurveData; //显性主曲线的数据
QVector<QVector<double>> NormalDistributionData(31); //31条隐性类正态分布曲线的数据
double CurvePF[31]; //31条隐性类正态分布曲线的中心频率
double CurveQ[31]; //31条隐性类正态分布曲线的Q值
double CurveGain[31]; //31条隐性类正态分布曲线的增益
void update(); //根据类中数据,更新曲线数据
double gaussrand(double inputdata, double pf, double Q, double gain); //类正态分布曲线函数
}
//函数功能:根据类中数据,更新主曲线数据
void
EQcurve::update(void)
{
//更新31条隐性类正态分布曲线的数据
for (int i = 0; i < 31; ++i)
{
for (int j = 0; j < Xaxisdata.count(); ++j)
{
NormalDistributionData[i][j] = gaussrand(Xaxisdata[j], CurvePF[i], CurveQ[i], CurveGain[i]);
}
}
//更新显性主曲线的数据
for (int i = 0; i < MainCurveData.count(); ++i)
{
//更新主曲线前,先重置
MainCurveData[i] = 0;
for (int j = 0; j < 31; ++j)
{
MainCurveData[i] = MainCurveData[i] + NormalDistributionData[i][j];
}
}
}
//函数功能:类高斯分布
//函数参数:value是横坐标下的输入值;u是正态分布的期望值;Amp是正态分布的顶点幅度
//函数返回值:纵坐标下的输出值
double EQcurve::gaussrand(double inputdata, double pf, double Q, double gain)
{
//sigma是标准差,决定了类正态分布的曲线胖瘦
//double sigma = 0.3;
double mvalue = gain * exp(-(inputdata - pf) * (inputdata - pf) / (2 * Q * Q));
//qDebug()<<mvalue1;
return mvalue;
}
三、同类控件使用相同的槽函数处理
//给所有的可输入框添加信号与槽连接
QList<QLineEdit *> mInputLines = ui->ControlPanel->findChildren<QLineEdit *>();//找到ControlPanel下所有QLineEdit控件
for(int i=0; i < mInputLines.count(); i++)
{
//排除用来占位的非可输入框
QString TempNowStr=mInputLines.at(i)->objectName();//获取输入框的句柄名称
QStringList TempStr=TempNowStr.split("_");//使用分隔符分割字符串
if(TempStr.count()<2)
{
continue;
}
//建立信号与槽函数,将它们连接到同一个槽函数
connect(mInputLines.at(i),SIGNAL(editingFinished()),this,SLOT(on_textChanged()));
}
//给所有的滑动块添加信号与槽连接
QList<QSlider *> mSliders = ui->ControlPanel->findChildren<QSlider *>();//找到ControlPanel下所有QSlider控件
for(int i=0; i < mSliders.count(); i++)
{
//排除用来占位的非可滑动块
QString TempNowStr=mSliders.at(i)->objectName();//获取输入框的句柄名称
QStringList TempStr=TempNowStr.split("_");//使用分隔符分割字符串
if(TempStr.count()<2)
{
continue;
}
//建立信号与槽函数,将它们连接到同一个槽函数
connect(mSliders.at(i),SIGNAL(valueChanged(int)),this,SLOT(on_sliderChanged(int)));
}
//函数功能:输入框变化事件处理函数
void MainWindow::on_textChanged()
{
//获取当前操作的控件
QLineEdit *mlineedit = qobject_cast<QLineEdit*>(sender());
QString TempNowStr=mlineedit->objectName();
TempNowStr=TempNowStr.mid(5);
QStringList TempStr=TempNowStr.split("_");
//改变每一个滑块变动值
QString temp=TempStr[0];
//如果找到的数字和,FlagNowShow相同
//则变动输入框的内容,直接退出循环
if(TempStr[1]=="PF")
{
//修改增益值
mEQcurve->CurvePF[temp.toInt()-1]=mlineedit->text().toDouble();
}else if(TempStr[1]=="Q")
{
//修改增益值
mEQcurve->CurveQ[temp.toInt()-1]=mlineedit->text().toDouble();
}else if(TempStr[1]=="Gain")
{
//修改增益值
mEQcurve->CurveGain[temp.toInt()-1]=mlineedit->text().toDouble();
}
FlagNowShow=temp.toInt()-1;
//更新曲线
UpdateCurve(FlagNowShow);
}
//函数功能:滑块位置变化事件处理函数
void MainWindow::on_sliderChanged(int)
{
//获取当前操作的控件
QSlider *mSlider = qobject_cast<QSlider*>(sender());
//获得控件的名称
QString TempNowStr=mSlider->objectName();
QStringList TempStr=TempNowStr.split("_");
//改变每一个滑块变动值
QString temp=TempStr[1];
//修改增益值
mEQcurve->CurveGain[temp.toInt()-1]=mSlider->value();
FlagNowShow=temp.toInt()-1;
//更新曲线
UpdateCurve(FlagNowShow);
}