Qt C++如何从已有窗口按钮获取值并传递到新窗口使用
实现思路
Qt对话框之间传值优先用「自定义公共接口获取选中值 + 实例化第二个对话框时传参」的方案,逻辑清晰不易出错,不需要复杂的信号槽绑定,非常适合新手使用。
核心流程:
- 用户在主窗口打开FirstDialog,选完选项后点击确认
- 在FirstDialog的确认槽函数里,先把所有RadioButton、CheckBox的选中状态读出来存在自定义结构体里
- 实例化SecondDialog,把结构体作为参数传给SecondDialog的构造函数或者专门的赋值方法
- SecondDialog拿到数据后直接展示即可
完整示例代码
首先定义共用的数据结构体,单独存放在头文件datadef.h中:
#ifndef DATADEF_H #define DATADEF_H #include <QStringList> // 自定义结构体存储用户选中的所有内容,可根据需求扩展字段 struct UserSelectData { QString selectedRadioText; // 选中的单选框文本 QStringList selectedCheckTexts; // 选中的复选框文本列表 int totalScore; // 可选字段,用于存储合计分值 }; #endif // DATADEF_H
1. FirstDialog 实现代码
firstdialog.h
#ifndef FIRSTDIALOG_H #define FIRSTDIALOG_H #include <QDialog> #include "datadef.h" QT_BEGIN_NAMESPACE namespace Ui { class FirstDialog; } QT_END_NAMESPACE class FirstDialog : public QDialog { Q_OBJECT public: explicit FirstDialog(QWidget *parent = nullptr); ~FirstDialog(); // 对外暴露的公共方法,外部可通过这个方法获取用户选中的所有数据 UserSelectData getSelectData() const; private slots: // 确认按钮的点击槽函数,在Qt设计师界面右键按钮转到槽会自动生成 void on_btnConfirm_clicked(); private: Ui::FirstDialog *ui; UserSelectData m_currentData; // 成员变量存储当前用户选中的数据 }; #endif // FIRSTDIALOG_H
firstdialog.cpp
#include "firstdialog.h" #include "ui_firstdialog.h" #include <QMessageBox> FirstDialog::FirstDialog(QWidget *parent) : QDialog(parent) , ui(new Ui::FirstDialog) { ui->setupUi(this); // 示例默认UI控件:3个单选框(radioBtn1/radioBtn2/radioBtn3)、3个复选框(checkBox1/checkBox2/checkBox3)、1个确认按钮(btnConfirm),可根据自己的UI修改对应名称 } FirstDialog::~FirstDialog() { delete ui; } UserSelectData FirstDialog::getSelectData() const { return m_currentData; } void FirstDialog::on_btnConfirm_clicked() { // 先清空上一次的存储数据 m_currentData.selectedCheckTexts.clear(); m_currentData.totalScore = 0; // 读取单选框选中值 if(ui->radioBtn1->isChecked()){ m_currentData.selectedRadioText = ui->radioBtn1->text(); m_currentData.totalScore += 10; // 示例逻辑:选中该单选框加10分,可自行修改 }else if(ui->radioBtn2->isChecked()){ m_currentData.selectedRadioText = ui->radioBtn2->text(); m_currentData.totalScore += 20; }else if(ui->radioBtn3->isChecked()){ m_currentData.selectedRadioText = ui->radioBtn3->text(); m_currentData.totalScore += 30; }else{ QMessageBox::warning(this,"提示","请先选择单选框选项"); return; // 单选框必选,没选就不往下走 } // 读取复选框选中值 if(ui->checkBox1->isChecked()){ m_currentData.selectedCheckTexts.append(ui->checkBox1->text()); m_currentData.totalScore += 5; // 示例逻辑:每个选中的复选框加5分,可自行修改 } if(ui->checkBox2->isChecked()){ m_currentData.selectedCheckTexts.append(ui->checkBox2->text()); m_currentData.totalScore += 5; } if(ui->checkBox3->isChecked()){ m_currentData.selectedCheckTexts.append(ui->checkBox3->text()); m_currentData.totalScore += 5; } // 所有校验通过,关闭当前对话框,返回Accepted状态 this->accept(); }
2. SecondDialog 实现代码
seconddialog.h
#ifndef SECONDDIALOG_H #define SECONDDIALOG_H #include <QDialog> #include "datadef.h" QT_BEGIN_NAMESPACE namespace Ui { class SecondDialog; } QT_END_NAMESPACE class SecondDialog : public QDialog { Q_OBJECT public: // 构造函数直接接收传入的用户选中数据 explicit SecondDialog(const UserSelectData& data, QWidget *parent = nullptr); ~SecondDialog(); private: Ui::SecondDialog *ui; UserSelectData m_receiveData; // 存储接收到的FirstDialog传过来的数据 void showData(); // 私有方法,用于把数据渲染到页面控件上 }; #endif // SECONDDIALOG_H
seconddialog.cpp
#include "seconddialog.h" #include "ui_seconddialog.h" SecondDialog::SecondDialog(const UserSelectData& data, QWidget *parent) : QDialog(parent) , ui(new Ui::SecondDialog) , m_receiveData(data) // 初始化时把传入的数据赋值给成员变量 { ui->setupUi(this); showData(); // 页面加载完成直接展示结果 } SecondDialog::~SecondDialog() { delete ui; } void SecondDialog::showData() { // 示例UI控件:3个标签分别展示单选结果、复选结果、合计结果,可根据自己的需求修改展示逻辑 ui->labelRadioResult->setText("选中的单选选项:" + m_receiveData.selectedRadioText); ui->labelCheckResult->setText("选中的复选选项:" + m_receiveData.selectedCheckTexts.join("、")); ui->labelTotalResult->setText("合计得分:" + QString::number(m_receiveData.totalScore)); }
3. 主窗口调用逻辑
主窗口中打开FirstDialog的按钮对应的槽函数写法:
#include "mainwindow.h" #include "ui_mainwindow.h" #include "firstdialog.h" #include "seconddialog.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } // 主窗口打开FirstDialog的按钮槽函数,按钮名为btnOpenFirst,右键按钮转到槽自动生成 void MainWindow::on_btnOpenFirst_clicked() { FirstDialog firstDlg(this); // 阻塞等待用户操作FirstDialog,只有点击确认按钮返回Accepted才继续执行 if(firstDlg.exec() == QDialog::Accepted){ // 获取FirstDialog中用户选中的所有数据 UserSelectData data = firstDlg.getSelectData(); // 把数据传入SecondDialog并打开 SecondDialog secondDlg(data, this); secondDlg.exec(); } }
补充说明
- 代码中的控件名需要和你自己Qt设计师里的控件名保持一致,不一致修改对应名称即可
- 如果需要实现「FirstDialog选值实时同步到已打开的SecondDialog」的需求,可以改用信号槽实现:在FirstDialog中选值变化时发射带
UserSelectData参数的信号,SecondDialog绑定该信号写槽函数接收数据即可,注意结构体在信号槽中使用前需要先调用qRegisterMetaType<UserSelectData>("UserSelectData");注册元类型
内容的提问来源于stack exchange,提问作者DAYU
相关产品推荐
相关产品推荐

