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

Qt游戏项目:如何从主窗口向弹窗传递变量?

Qt主窗口变量传递至弹窗的实现方法

给你几种实用的实现方式,都是Qt开发里常用的:

1. 构造函数传参(最直接的同步方式)

直接在弹窗的构造函数里加参数,创建弹窗时把主窗口的变量传进去:

弹窗类代码(MyDialog)

头文件 mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;
}

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    // 修改构造函数,添加需要传递的变量参数
    explicit MyDialog(int gameScore, QWidget *parent = nullptr);
    ~MyDialog();

private:
    Ui::MyDialog *ui;
};

#endif // MYDIALOG_H

源文件 mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

MyDialog::MyDialog(int gameScore, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
    // 直接用传递过来的变量更新弹窗UI,比如显示分数
    ui->scoreLabel->setText(QString("当前分数:%1").arg(gameScore));
}

MyDialog::~MyDialog()
{
    delete ui;
}

主窗口调用代码

// 假设主窗口中有个int类型的变量currentScore
int currentScore = 100;
// 创建弹窗时直接传入变量
MyDialog *dialog = new MyDialog(currentScore, this);
dialog->exec();

2. 公共Setter方法(灵活的赋值方式)

如果需要先创建弹窗对象,后续再传递变量,就给弹窗加个公共的set方法:

弹窗类代码

头文件 mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;
}

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MyDialog(QWidget *parent = nullptr);
    ~MyDialog();
    // 公共set方法,用于接收主窗口传递的变量
    void setGameScore(int score);

private:
    Ui::MyDialog *ui;
};

#endif // MYDIALOG_H

源文件 mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
}

MyDialog::~MyDialog()
{
    delete ui;
}

void MyDialog::setGameScore(int score)
{
    ui->scoreLabel->setText(QString("当前分数:%1").arg(score));
}

主窗口调用代码

int currentScore = 100;
MyDialog *dialog = new MyDialog(this);
// 先调用set方法传递变量
dialog->setGameScore(currentScore);
dialog->exec();

3. 信号槽机制(异步/实时更新场景)

如果主窗口的变量会动态变化,需要弹窗实时同步,就用Qt的信号槽:

主窗口类代码

头文件 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
    // 定义信号,用于传递变量变化
signals:
    void scoreUpdated(int newScore);

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    int currentScore = 0;

    // 比如某个操作触发分数变化时发射信号
    void updateScore() {
        currentScore += 50;
        emit scoreUpdated(currentScore);
    }
};
#endif // MAINWINDOW_H

弹窗类代码

头文件 mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;
}

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MyDialog(QWidget *parent = nullptr);
    ~MyDialog();

private slots:
    // 定义槽函数,接收主窗口的变量
    void onScoreChanged(int score);

private:
    Ui::MyDialog *ui;
};

#endif // MYDIALOG_H

源文件 mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
}

MyDialog::~MyDialog()
{
    delete ui;
}

void MyDialog::onScoreChanged(int score)
{
    ui->scoreLabel->setText(QString("实时分数:%1").arg(score));
}

主窗口中连接信号槽并显示弹窗

MyDialog *dialog = new MyDialog(this);
// 连接主窗口的信号和弹窗的槽
connect(this, &MainWindow::scoreUpdated, dialog, &MyDialog::onScoreChanged);
dialog->show(); // 用show()而非exec(),避免阻塞主窗口操作

内容的提问来源于stack exchange,提问作者Léa CHABBAL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:10:29