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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:15:06