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

如何从MainWindow类访问其他类Qt UI并实现跨窗口数据传递

Qt 跨窗口传值实现方案

这个需求完全可以实现,Qt 自带的信号槽机制就是专门用于处理这类跨类、跨组件通信场景的,以下是完整实现步骤和代码示例:

核心实现逻辑

  • 在 DialogClass 中自定义一个携带字符串参数的信号,点击 Dialog 窗口的提交按钮时触发该信号,把输入框的内容作为参数发出
  • MainWindow 创建 DialogClass 实例时,将 Dialog 的自定义信号和 MainWindow 的接收槽函数绑定,即可直接拿到传输的内容

具体代码实现

1. 定义 DialogClass 类

头文件 dialogclass.h

#ifndef DIALOGCLASS_H
#define DIALOGCLASS_H

#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>

class DialogClass : public QDialog
{
    Q_OBJECT // 使用信号槽必须加该宏
public:
    explicit DialogClass(QWidget *parent = nullptr);

signals:
    // 自定义信号,用于传递输入内容,无需写实现代码
    void inputDataSubmitted(const QString &data);

private slots:
    // 提交按钮点击的槽函数,用于触发自定义信号
    void onSubmitBtnClicked();

private:
    QLineEdit *m_inputLineEdit;
    QPushButton *m_submitBtn;
};

#endif // DIALOGCLASS_H

实现文件 dialogclass.cpp

#include "dialogclass.h"

DialogClass::DialogClass(QWidget *parent)
    : QDialog(parent)
{
    // 窗口基础配置
    setWindowTitle("输入窗口");
    resize(300, 120);
    QVBoxLayout *layout = new QVBoxLayout(this);

    // 初始化输入框
    m_inputLineEdit = new QLineEdit(this);
    layout->addWidget(m_inputLineEdit);

    // 初始化提交按钮
    m_submitBtn = new QPushButton("提交内容", this);
    layout->addWidget(m_submitBtn);

    // 绑定按钮点击信号到当前类的槽函数
    connect(m_submitBtn, &QPushButton::clicked, this, &DialogClass::onSubmitBtnClicked);
}

void DialogClass::onSubmitBtnClicked()
{
    // 获取输入框内容,触发自定义信号
    QString inputContent = m_inputLineEdit->text().trimmed();
    emit inputDataSubmitted(inputContent);
    // 提交后关闭窗口,不需要可注释该行
    close();
}

2. 定义 MainWindow 类

头文件 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QDebug>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    // 打开Dialog窗口的槽函数
    void onOpenDialogBtnClicked();
    // 接收Dialog传输内容的槽函数
    void onReceiveInputData(const QString &data);

private:
    QPushButton *m_openDialogBtn;
};
#endif // MAINWINDOW_H

实现文件 mainwindow.cpp

#include "mainwindow.h"
#include "dialogclass.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("主窗口");
    resize(400, 300);

    // 初始化打开Dialog的按钮
    m_openDialogBtn = new QPushButton("打开输入窗口", this);
    m_openDialogBtn->move(150, 130);
    // 绑定按钮点击信号到打开窗口的槽函数
    connect(m_openDialogBtn, &QPushButton::clicked, this, &MainWindow::onOpenDialogBtnClicked);
}

MainWindow::~MainWindow()
{
}

void MainWindow::onOpenDialogBtnClicked()
{
    // 创建Dialog实例
    DialogClass *dialog = new DialogClass(this);
    // 绑定Dialog的自定义信号到主窗口的接收槽函数
    connect(dialog, &DialogClass::inputDataSubmitted, this, &MainWindow::onReceiveInputData);
    // exec()为模态打开(阻塞主窗口操作),非模态打开用show(),此时需加dialog->setAttribute(Qt::WA_DeleteOnClose)避免内存泄漏
    dialog->exec();
}

void MainWindow::onReceiveInputData(const QString &data)
{
    // 此处为接收到的内容,可替换为自身业务逻辑,示例为打印到控制台
    qDebug() << "接收到输入内容:" << data;
}

3. 主函数 main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

注意事项

  • 使用信号槽的类必须添加Q_OBJECT宏,否则会编译报错
  • 信号和槽函数的参数类型必须完全对应,否则绑定会失效
  • 非模态打开Dialog时建议设置Qt::WA_DeleteOnClose属性,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 13:45:01