QtC++中的代码优化——if嵌套篇

 一、简化重复结构的信号槽连接

1.先看代码

void TOVChanged();
void TOVDelayChanged();
void TOVRChanged();
void TOVRDelayChanged();
//类似的槽函数…………

void LiBatteryManagerSys::TOVChanged()
{
	float newData = ui->lineEdit_TOV->text().toFloat();
	int writeInt = newData * 10;
	m_communicator->writeTOV(writeInt);
}

void LiBatteryManagerSys::TOVDelayChanged()
{
	float newData = ui->lineEdit_TOVDelay->text().toFloat();
	int writeInt = newData * 10;
	m_communicator->writeTOVDelay(writeInt);
}

void LiBatteryManagerSys::TOVRChanged(){
//…………
}

void LiBatteryManagerSys::TOVRDelayChanged(){
//…………
}
//…………

connect(ui->lineEdit_TOV,&QLineEdit::editingfinished,this,&LiBatteryManagerSys::TOVChanged);
connect(ui->lineEdit_TOVDelay,&QLineEdit::editingfinished,this,&LiBatteryManagerSys::TOVDelayChanged);
//…………

 可以看到这段代码中的代码重复性很高,而且会需要连接多对信号槽。这样使得代码很不优雅。

2.解决方法

找到代码的共性:都是由QLineEdit类发出,由主窗口LiBatteryManagerSys类接收。因此可以修改为:

void LiBatteryManagerSys::valueChanged()
{
    QLineEdit *lineEdit = qobject_cast<QLineEdit*>(sender());
    if (!lineEdit)
        return;

    float newData = lineEdit->text().toFloat();
    int writeInt = newData * 10;

    if (lineEdit == ui->lineEdit_TOV) {
        m_communicator->writeTOV(writeInt);
    } else if (lineEdit == ui->lineEdit_TOVDelay) {
        m_communicator->writeTOVDelay(writeInt);
    } else if (lineEdit == ui->lineEdit_TOVR) {
        m_communicator->writeTOVR(writeInt);
    } else if (lineEdit == ui->lineEdit_TOVRDelay) {
        m_communicator->writeTOVRDelay(writeInt);
    }
}

connect(ui->lineEdit_TOV, &QLineEdit::textChanged, this, &LiBatteryManagerSys::valueChanged);
connect(ui->lineEdit_TOVDelay, &QLineEdit::textChanged, this, &LiBatteryManagerSys::valueChanged);
//…………

二、优化if嵌套结构 

当简化了重复的信号槽的问题时,又产生了新的问题——if嵌套语句。

if嵌套的结构写起来比较省事,但是看起来比较容易被鄙视,嵌套次数少还好 ,但是遇到像我这个项目,有几十上百个QLineEdit需要if来判断的时候,代码就显得非常的臃肿。

解决方法:建立映射关系

#include <QMap>

// 在类的声明中定义一个映射容器
QMap<QLineEdit*, std::function<void(int)>> lineEditActions;

// ...

void LiBatteryManagerSys::setupLineEditActions()
{
    lineEditActions[ui->lineEdit_TOV] = [this](int value) { m_communicator->writeTOV(value); };
    lineEditActions[ui->lineEdit_TOVDelay] = [this](int value) { m_communicator->writeTOVDelay(value); };
    lineEditActions[ui->lineEdit_TOVR] = [this](int value) { m_communicator->writeTOVR(value); };
    lineEditActions[ui->lineEdit_TOVRDelay] = [this](int value) { m_communicator->writeTOVRDelay(value); };
}

void LiBatteryManagerSys::valueChanged()
{
    QLineEdit *lineEdit = qobject_cast<QLineEdit*>(sender());
    if (!lineEdit)
        return;

    float newData = lineEdit->text().toFloat();
    int writeInt = newData * 10;

    auto actionIter = lineEditActions.find(lineEdit);
    if (actionIter != lineEditActions.end()) {
        actionIter.value()(writeInt);
    }
}

在类的构造函数中调用 setupLineEditActions() 来建立映射关系,然后在 valueChanged() 槽函数中使用这个映射来执行相应的操作。这种方法将逻辑与操作进行了分离,让代码看起来更加整洁和美观。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值