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
相关产品推荐
相关产品推荐

