You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Qt使用Getter无法获取readJson设置的正确值求助

问题原因与解决方案:Getter无法获取readJson设置的值

嘿,我一眼就看出问题所在了——你遇到的是局部变量作用域和未初始化对象导致的问题,咱们一步步拆解:

问题根源

  1. 局部对象的生命周期问题
    在readJson()函数里,你创建的nsline、ewline这些对象都是局部变量,当函数执行完最后一行代码后,这些对象就会被系统销毁,它们存储的计数数值也跟着消失了。

而在showpiechartbtnReleased()里,你又重新创建了一组全新的nsline等对象,这些对象和readJson()里的完全是两个独立的实例,没有任何关联。

  1. 未初始化的垃圾值
    新创建的这些对象如果没有给成员变量设置默认初始值,那么它们的成员变量会是内存里的随机垃圾数据,这就是你看到那些奇怪整数的原因(比如1514685496、-1479339952)。

解决方案(推荐第一种)

方案1:使用类成员变量(最规范的做法)

把nsline、ewline等对象定义为包含这两个函数的类的成员变量,这样两个函数操作的是同一个对象实例,数据就能共享了。

步骤1:在类头文件中声明成员变量

假设你的两个函数属于MainGUI类,在头文件里添加:

class MainGUI {
private:
    // 把这些对象声明为类的成员变量
    nsline m_nsline;
    ewline m_ewline;
    neline m_neline;
    ccline m_ccline;
    dtline m_dtline;
    orline m_orline;
public:
    void readJson();
    void showpiechartbtnReleased();
    // ... 其他成员函数
};

步骤2:修改readJson()函数

删除原来的局部对象声明,直接使用类的成员变量:

void MainGUI::readJson() {
    // ... 前面的JSON解析代码不变
    
    // 删掉这些局部对象声明:
    // nsline nsline;
    // ewline ewline;
    // ...
    
    int nsl = 0, ewl = 0, nel = 0, ccl = 0, dtl = 0, orl = 0;
    int totalline = tsds.getLine().size();
    // ... 统计逻辑不变
    
    // 直接给成员变量赋值
    m_nsline.setlines(nsl);
    m_ewline.setlines(ewl);
    m_neline.setlines(nel);
    m_ccline.setlines(ccl);
    m_dtline.setlines(dtl);
    m_orline.setlines(orl);
    
    // ... 调试输出不变
}

步骤3:修改showpiechartbtnReleased()函数

同样删除局部对象声明,直接读取成员变量的值:

void MainGUI::showpiechartbtnReleased() {
    // 删掉这些局部对象声明:
    // nsline nsline;
    // ewline ewline;
    // ...
    
    // 直接从成员变量获取值
    int nsl = m_nsline.getlines();
    int ewl = m_ewline.getlines();
    int nel = m_neline.getlines();
    int ccl = m_ccline.getlines();
    int dtl = m_dtline.getlines();
    int orl = m_orline.getlines();
    
    // ... 饼图绘制逻辑不变
}

方案2:使用全局变量(不推荐,仅临时场景用)

如果不想修改类结构,可以把nsline等对象声明为全局变量,这样所有函数都能访问同一个实例。但全局变量会增加代码耦合度,不利于后续维护,所以尽量不用。

在.cpp文件顶部添加全局声明:

nsline global_nsline;
ewline global_ewline;
neline global_neline;
ccline global_ccline;
dtline global_dtline;
orline global_orline;

然后在两个函数里直接使用这些全局对象,替换原来的局部对象即可。

方案3:传递对象引用(跨类场景用)

如果readJson()和showpiechartbtnReleased()属于不同的类,可以在调用showpiechartbtnReleased()时,把readJson()里的对象以引用方式传递过去:

修改showpiechartbtnReleased()的参数:

void MainGUI::showpiechartbtnReleased(nsline& ns, ewline& ew, neline& ne, ccline& cc, dtline& dt, orline& orl) {
    int nsl = ns.getlines();
    int ewl = ew.getlines();
    // ... 后续饼图逻辑不变
}

然后在readJson()里调用该函数时传入对象:

void readJson() {
    // ... 统计完成后
    MainGUI gui; // 假设这里有MainGUI实例
    gui.showpiechartbtnReleased(nsline, ewline, neline, ccline, dtline, orline);
}

注意:这种方式要确保传递引用时,原对象还处于生命周期内,避免出现悬垂引用。

总结

最推荐的是方案1,使用类成员变量,既能保证数据的一致性,又能让代码结构更清晰,符合面向对象的设计思想。

内容的提问来源于stack exchange,提问作者Zelsey Nanos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:55:21