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
相关产品推荐
相关产品推荐

