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

QT多UI间Travelagency实例传递问题:普通对象转shared_ptr

问题分析与解决方案

核心问题

你遇到的两个现象本质都是主UI和子UI没有共享同一个Travelagency实例:

  • 用std::make_shared复制普通实例:相当于创建了一个全新的Travelagency拷贝,子UI操作的是这个独立副本,且如果子UI未设置父窗口或未被持久化持有,函数作用域结束后就会被销毁,导致窗口直接消失。
  • 用new创建子UI但数据丢失:子UI拿到的shared_ptr没有指向主UI的原实例,两边操作的是不同对象,添加的客户自然不会同步到主UI的vector中。

解决方案

1. 主UI改用shared_ptr持有Travelagency

放弃栈上的普通实例,全程用智能指针管理同一个Travelagency对象,确保主、子UI共享数据:

// Holiday(主UI)类的成员变量
std::shared_ptr<Travelagency> m_travelAgency;

// 主UI初始化逻辑(比如构造函数)
m_travelAgency = std::make_shared<Travelagency>();
m_travelAgency->readJson("your_data.json"); // 读取JSON数据

2. 正确传递shared_ptr给子UI

打开子UI时,直接传递主UI持有的shared_ptr,并将主UI设为子UI的父窗口(让Qt自动管理子窗口生命周期):

// 主UI中打开New_Customer的代码
void Holiday::openNewCustomerDialog() {
    New_Customer* newCustomerUI = new New_Customer(m_travelAgency, this);
    newCustomerUI->show();
}

3. 子UI正确接收并持有shared_ptr

确保子UI的构造函数保存传入的shared_ptr,保证操作的是同一个Travelagency实例:

// New_Customer的构造函数
New_Customer::New_Customer(std::shared_ptr<Travelagency> agency, QWidget* parent)
    : QDialog(parent), m_agency(std::move(agency)) {
    // 初始化子UI控件
}

// New_Customer的成员变量
std::shared_ptr<Travelagency> m_agency;

额外注意事项

  • 不要手动拷贝Travelagency实例:如果你的Travelagency类包含动态资源(如文件句柄、网络连接),错误的拷贝会导致资源泄漏或数据不一致,全程用shared_ptr共享对象是最安全的方式。
  • 避免将栈上对象直接转为shared_ptr:如果主UI原本的Travelagency是栈实例,直接用std::shared_ptr<Travelagency>(&普通实例)会导致双重释放(智能指针和栈销毁时都会释放对象),必须从一开始就用make_shared创建。

内容的提问来源于stack exchange,提问作者Shams Mohammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:52:16