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

Qt如何从槽函数(Slot)中获取整数值并传递给另一个Form表单

Qt跨表单整数值传递实现方案

Qt跨表单传值推荐使用信号槽机制,属于Qt原生的低耦合实现方式,也可以用成员属性存储+传递的方式,两种实现步骤如下:

你原有代码的核心问题:第二个表单槽函数中addteacherform at;是重新创建了一个新的表单实例,和你之前操作的第一个表单不是同一个对象,且selectedInsID是第一个表单槽函数的局部变量,函数执行完就会销毁,自然无法拿到值。


方案1:信号槽实现(推荐,低耦合)

步骤1:修改第一个表单addteacherform的头文件和槽函数

在addteacherform.h中添加自定义信号和成员变量:

// addteacherform.h
class addteacherform : public QWidget
{
    Q_OBJECT
// 自定义信号声明
signals:
    void sendInsID(int insID);

private:
    // 把selectedInsID从局部变量改成类成员变量
    int selectedInsID;
};

修改第一个表单的槽函数,查询到值后发送信号,同时修复原有SQL注入风险:

void addteacherform::on_instableView_activated(const QModelIndex &index)
{
    QString val = ui->instableView->model()->data(index).toString();
    dbRepository dr;

    dr.OpenDBConnection();
    QSqlQuery qry;
    // 替换原有字符串拼接的写法,用参数绑定避免SQL注入
    qry.prepare("SELECT * FROM InstructorTbl WHERE InsFname= :fname");
    qry.bindValue(":fname", val);

    if(qry.exec()){
        while(qry.next()){
            selectedInsID = qry.value(0).toInt();
            // 拿到值后发送信号
            emit sendInsID(selectedInsID);
        }
    }
    dr.CloseDBConnection();
}

步骤2:修改第二个表单viewhandledsubjectform的头文件和业务逻辑

在viewhandledsubjectform.h中添加接收信号的槽函数和存储ID的成员变量:

// viewhandledsubjectform.h
class viewhandledsubjectform : public QWidget
{
    Q_OBJECT
private slots:
    // 接收ID的槽函数声明
    void getInsID(int insID);

private:
    // 存储传递过来的ID,默认值可以设为无效值比如-1做异常判断
    int currentInsID = -1;
};

实现槽函数:

void viewhandledsubjectform::getInsID(int insID)
{
    currentInsID = insID;
}

步骤3:在两个表单的实例化位置绑定信号槽

你在哪里创建两个表单的实例,就在哪里添加绑定逻辑,比如主窗口中创建的示例:

// 假设你已经实例化了两个表单对象 addTeacherForm 和 handledSubForm
connect(addTeacherForm, &addteacherform::sendInsID, handledSubForm, &viewhandledsubjectform::getInsID);

之后你就可以在第二个表单的插入逻辑中直接使用currentInsID,修改插入语句即可:

// 插入语句补充InsID字段
qry1.prepare("INSERT INTO InsSubHandleTbl (SubjectCode, InsID)"
            "VALUES (:SubjectCode, :InsID)");
qry1.bindValue(":SubjectCode",data);
qry1.bindValue(":InsID", currentInsID);

方案2:成员属性传递(适合表单为父子级关系的场景)

如果你的第二个表单是在第一个表单中直接打开的,可以用更简单的set方法传递:

步骤1:给第二个表单添加公开的set方法

// viewhandledsubjectform.h
public:
    void setCurrentInsID(int insID);
private:
    int currentInsID = -1;
// viewhandledsubjectform.cpp
void viewhandledsubjectform::setCurrentInsID(int insID)
{
    currentInsID = insID;
}

步骤2:第一个表单拿到ID后直接调用set方法

// 第一个表单的槽函数中,拿到selectedInsID后如果要打开第二个表单
void addteacherform::on_instableView_activated(const QModelIndex &index)
{
    // ...原有查询逻辑拿到selectedInsID
    viewhandledsubjectform *subForm = new viewhandledsubjectform(this);
    subForm->setCurrentInsID(selectedInsID);
    subForm->show();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:33:02