Qt解决大量重复数据的操作

本文介绍了如何通过批量操作简化控件初始化,如设置QLineEdit范围并统一槽函数处理。同时,作者展示了如何使用类结构管理复杂的曲线图数据,包括1条显性主曲线和31条隐性正态分布曲线,提高代码组织和效率。
摘要由CSDN通过智能技术生成

一、大量同类控件的初始化

如下图所示,【频率】、【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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kissgoodbye2012

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

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

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

打赏作者

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

抵扣说明:

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

余额充值