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

QT Creator C++ QDialog向MainWindow传值异常求解

问题根因
  • 信号槽绑定时机错误:adduser_window.exec() 是模态对话框阻塞调用,代码执行到这一行会停住等待子窗口关闭,你把connect写在exec()之后,等子窗口已经触发完add信号、生命周期都快结束了才完成绑定,槽函数永远收不到信号。
  • 存储结构不符合需求:你定义的是单个User mUser成员,需求要求存入vector<User> users容器,原有逻辑每次传值只会覆盖单个变量,存不下多个用户。
  • 子窗口存在冗余逻辑:子窗口内的users_.push_back(u1)完全无效,子窗口关闭后自身成员变量会被销毁,不需要承担存储用户列表的职责。
  • 冗余调用:槽函数里的this->show()无意义,主窗口全程处于显示状态,弹出模态子窗口不会隐藏主窗口。
修正代码

1. 修改主窗口头文件 mainwindow.h

替换原有单个用户成员为需求要求的vector容器:

#include <QMainWindow>
#include "User.h"
#include <vector>
// 其余已有include、UI指针、构造函数等声明保持不变

class MainWindow : public QMainWindow
{
    Q_OBJECT
// 其余已有声明保持不变
private slots:
    void on_button_adduser_clicked();

private:
    // 删除原有 User mUser; 替换为容器
    std::vector<User> users;
    // 其余已有成员变量保持不变
};

2. 修改主窗口实现文件 mainwindow.cpp

核心调整为先绑定信号槽,再调用exec()弹出子窗口,收到数据直接存入容器:

#include "mainwindow.h"
#include "adduserwindow.h"
// 其余已有include保持不变

void MainWindow::on_button_adduser_clicked()
{
    AddUserWindow adduser_window(this);
    // 必须在exec()之前完成信号槽绑定
    connect(&adduser_window, &AddUserWindow::add, this, [this](const User& user) {
        // 存入用户列表
        users.push_back(user);
        qDebug() << "新增用户信息:" << user.toString();
        // 删除冗余的this->show()调用
    });
    // 绑定完成后再弹出模态窗口
    adduser_window.exec();
}

如果要保留原有setUser方法,只需把方法逻辑改为向users容器追加数据即可,lambda内直接调用this->setUser(user)。

3. 修改子窗口实现文件 adduserwindow.cpp

删除冗余的子窗口本地存储逻辑,提交数据后主动关闭窗口:

#include "adduserwindow.h"
// 其余已有include保持不变

void AddUserWindow::on_button_addUser_clicked()
{
    // 加trimmed()过滤输入首尾空格
    QString name = ui->text_name->text().trimmed();
    QString email = ui->text_email->text().trimmed();
    QString mobile = ui->text_mobile->text().trimmed();

    // 可选:增加非空校验,避免提交空数据
    if (name.isEmpty() || email.isEmpty() || mobile.isEmpty()) {
        qDebug() << "请填写完整的用户信息";
        return;
    }

    User u1(name.toStdString(), email.toStdString(), mobile.toStdString());
    // 删除冗余的 users_.push_back(u1); 逻辑
    emit add(u1);
    // 提交完成后关闭子窗口,用accept()可标识为用户确认提交,方便后续区分取消操作
    this->accept();
}
补充说明
  • 你之前添加的Q_DECLARE_METATYPE(User)宏是正确的,自定义类型通过Qt信号槽传递必须添加该声明,无需修改。
  • 如果子窗口设置了取消按钮,直接给按钮绑定this->reject()槽即可,点击取消不会触发add信号,不会写入无效数据。
  • 后续业务逻辑直接访问MainWindow类的users成员即可拿到所有录入的用户数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:54:14