``` #ifndef PENWUMODEL_H #define PENWUMODEL_H #include <QObject> class PenwuModel : public QObject { Q_OBJECT public: explicit PenwuModel(QObject *parent = 0); //喷雾1 quint8 GetAllPen(void){return m_AllPen1;} void SetAllPen(quint8 Allpen){m_AllPen1=Allpen;} //喷雾2 quint8 GetAllPen2(void){return m_AllPen2;} void SetAllPen2(quint8 Allpen){m_AllPen2=Allpen;} signals: public slots: private: //1 quint8 m_AllPen1; quint8 m_XLocation1; quint8 m_YLocation1; quint8 m_PenStart1; quint8 m_RunPen1; quint8 m_PenFront1; quint8 m_PenBack1; quint8 m_PenEnd1; quint8 m_PenSpeed1; quint8 m_PenTimes1; quint8 m_PenModulus1; quint8 m_PenStart2; quint8 m_RunPen2; quint8 m_PenFront2; quint8 m_PenBack2; quint8 m_PenEnd2; quint8 m_PenSpeed2; quint8 m_PenTimes2; quint8 m_PenModulus2; quint8 m_PenStart3; quint8 m_RunPen3; quint8 m_PenFront3; quint8 m_PenBack3; quint8 m_PenEnd3; quint8 m_PenSpeed3; quint8 m_PenTimes3; quint8 m_PenModulus3; quint8 m_JiapenStart; quint8 m_JiapenEnd; quint8 m_RunJia; quint8 m_JiaSpeed; quint8 m_JiaFront; quint8 m_JiaBack; quint8 m_JiaTimes; quint8 m_CenterPen; quint8 m_CenterPenTime; quint8 m_RunCenterPen; //喷雾2 quint8 m_AllPen2; }; #endif // PENWUMODEL_H #include "formpenwu.h" #include "ui_formpenwu.h" #include "formpenwu2.h" #include "QDebug" #include "penwumodel.h" Formpenwu::Formpenwu(QWidget *parent) : QWidget(parent), ui(new Ui::Formpenwu) { ui->setupUi(this); Penwu2=new Formpenwu2; pen1=new PenwuModel(this); connect(Penwu2,SIGNAL(Pageup()),this,SLOT(dealSignal())); } Formpenwu::~Formpenwu() { delete ui; delete Penwu2; } bool Formpenwu::EnterForm(void){ qDebug ()<<"ALLpen-start:"<<pen1->GetAllPen (); ui->doubleAllPenSpinBox->setValue (pen1->GetAllPen ()); show(); return true; } bool Formpenwu::ExitForm(void){ if(IsModified ()){ SaveData (); } hide(); return true; } void Formpenwu::on_NextButton_pressed(void) { this->ExitForm (); Penwu2->EnterForm (); } void Formpenwu::dealSignal(){ this->show(); Penwu2->hide (); } bool Formpenwu::IsModified(void){ if (ui->doubleAllPenSpinBox->value ()!=pen1->GetAllPen ()){ return true; } return false; } void Formpenwu::SaveData(void) { qDebug ()<<"value"<<ui->doubleAllPenSpinBox->value (); pen1->SetAllPen (ui->doubleAllPenSpinBox->value ()); qDebug ()<<"all pen now:"<<pen1->GetAllPen (); } #include "penwumodel.h" PenwuModel::PenwuModel(QObject *parent) : QObject(parent) { }```为什么init()函数被调用了2次:#include "penwumodel.h" #include "QDebug" PenwuModel::PenwuModel(QObject *parent) : QObject(parent) { Init(); } void PenwuModel::Init(void){ qDebug()<<"Init penwu data..."; m_AllPen1=0; m_XLocation1=0; m_YLocation1=0; m_PenStart1=0; m_RunPen1=0; m_PenFront1=0; m_PenBack1=0; m_PenEnd1=0; m_PenSpeed1=0; m_PenTimes1=0; m_PenModulus1=0; m_PenStart2=0; m_RunPen2=0; m_PenFront2=0; m_PenBack2=0; m_PenEnd2=0; m_PenSpeed2=0; m_PenTimes2=0; m_PenModulus2=0; m_PenStart3=0; m_RunPen3=0; m_PenFront3=0; m_PenBack3=0; m_PenEnd3=0; m_PenSpeed3=0; m_PenTimes3=0; m_PenModulus3=0; m_JiapenStart=0; m_RunJia=0; m_JiaSpeed=0; m_JiapenEnd=0; m_JiaFront=0; m_JiaBack=0; m_JiaTimes=0; m_CenterPen=0; m_CenterPenTime=0; m_RunCenterPen=0; }
时间: 2025-06-20 22:19:37 浏览: 16
<think>嗯,用户提供的代码中,PenwuModel的构造函数调用了Init()函数,但用户发现Init()被调用了两次。我需要仔细分析代码结构,找出可能的原因。
首先,查看PenwuModel的构造函数实现。在penwumodel.cpp中,构造函数确实调用了Init()。那问题可能出在对象的创建次数上。用户可能在代码中创建了多个PenwuModel实例,导致构造函数被多次调用。
接下来,检查Formpenwu类的构造函数。在Formpenwu的构造函数中,创建了一个pen1对象,作为this(即Formpenwu实例)的子对象。这里应该只创建一次PenwuModel,所以正常情况下,应该只调用一次Init()。
但是,用户提供的代码中有几个需要注意的地方。首先,PenwuModel的父对象是Formpenwu,而Formpenwu在析构时delete了Penwu2,但Penwu2是Formpenwu2类型的指针,可能与PenwuModel无关。不过,如果Formpenwu2中也创建了PenwuModel的实例,那就会导致再次调用构造函数和Init()。
另外,检查是否有其他地方显式或隐式地创建了PenwuModel的实例。例如,可能在Formpenwu2中也使用了PenwuModel,或者在某个地方进行了复制构造,导致意外的对象创建。
此外,用户提供的代码片段中,PenwuModel的构造函数在初始化列表中调用了父类QObject的构造函数。如果存在继承链或错误的对象管理,可能导致多次构造。
可能的另一个原因是,用户可能在代码中不小心调用了两次PenwuModel的构造函数,例如在某个地方直接实例化了PenwuModel两次,或者在信号槽连接中意外触发了创建。
总结可能的原因:
1. Formpenwu或Formpenwu2中多次创建PenwuModel实例。
2. 父对象管理不当,导致对象被多次构造。
3. 复制构造函数或赋值操作未被正确禁用,导致意外复制。
需要用户检查所有创建PenwuModel实例的地方,确保只创建一次。同时,检查是否有隐式的拷贝,比如将PenwuModel作为值传递而非指针,导致拷贝构造触发Init()。</think>代码中`Init()`被调用两次的根本原因在于**PenwuModel对象被创建了两次**。以下是具体分析过程:
$$\text{问题根源} = \text{构造函数调用次数} > 1$$
**步骤解析:**
1. **构造函数调用链分析**
在`PenwuModel.cpp`中,构造函数显式调用了`Init()`:
```cpp
PenwuModel::PenwuModel(QObject *parent) : QObject(parent)
{
Init(); // 此处触发第一次调用
}
```
2. **对象创建过程追踪**
- 在`Formpenwu`窗体中,通过`pen1 = new PenwuModel(this)`创建了**第一个实例**
- 在`Formpenwu`的析构函数中执行了`delete Penwu2`,而`Penwu2`是`Formpenwu2`类型
*如果`Formpenwu2`类中也包含`PenwuModel`成员变量*,则打开该窗体时会创建**第二个实例**
3. **验证方法**
在`PenwuModel`构造函数中添加打印语句:
```cpp
PenwuModel::PenwuModel(QObject *parent) : QObject(parent)
{
qDebug() << "PenwuModel Constructor Called";
Init();
}
```
如果输出两次该日志,则证实对象被重复创建。
**解决方案:**
1. **检查窗体层级关系**
- 确认`Formpenwu2`中是否包含`PenwuModel`成员变量
- 检查是否有其他代码路径(如按钮点击事件)重复创建实例
2. **使用单例模式(推荐)**
修改`PenwuModel`为单例,确保全局唯一实例:
```cpp
class PenwuModel : public QObject {
Q_OBJECT
public:
static PenwuModel* instance(QObject* parent = nullptr) {
static PenwuModel _instance(parent);
return &_instance;
}
// ... 原有成员函数
private:
explicit PenwuModel(QObject *parent = 0); // 构造函数私有化
};
```
3. **检查对象生命周期管理**
- 确保父对象`Formpenwu`在销毁时,Qt对象树能正确自动销毁子对象
- 移除不必要的`delete`操作(例如`Formpenwu`析构函数中的`delete Penwu2`可能引发双重删除)
**数学表达验证:**
设对象创建次数为$N$,则`Init()`调用次数满足:
$$C_{\text{Init}} = N \times 1$$
因此当$N=2$时,必然出现两次初始化日志。
阅读全文
相关推荐

















