Qt C++中Combobox如何获取当前文本对应的DepartmentTbl表ID值
实现方案
推荐方案(最优):初始化ComboBox时预绑定部门ID
这种方案不需要每次提交时额外查询数据库,性能更高,逻辑也更稳妥。
- 第一步:修改你填充
DepartmentCombo的代码,在添加部门名称时同步把对应的部门ID存入Item的用户数据域
示例填充代码:
// 你填充部门下拉框的逻辑位置,比如窗口构造函数/init函数里 QSqlQuery deptQry; deptQry.exec("SELECT DepartmentID, DepartmentName FROM DepartmentTbl"); while(deptQry.next()) { int deptId = deptQry.value(0).toInt(); QString deptName = deptQry.value(1).toString(); // 第二个参数就是存入的用户数据,存部门ID ui->DepartmentCombo->addItem(deptName, deptId); }
- 第二步:修改你现有槽函数里的取值逻辑,直接取预存的ID即可
修改后的槽函数代码:
void addteacherform::on_newTeacherButton_clicked() { dbRepository dr; dr.OpenDBConnection(); //retrieve data from field QString fname = ui->firstnameEdit->text(); QString mname = ui->middleIEdit->text(); QString lname = ui->lastnameEdit->text(); // 替换原来的currentText取值,直接拿预存的部门ID int departmentId = ui->DepartmentCombo->currentData().toInt(); //insert query QSqlQuery qry1; qry1.prepare("INSERT INTO InstructorTbl (InsFname, InsMname, InsLname, DepartmentID)" "VALUES (:InsFname, :InsMname, :InsLname,:DepartmentID)"); qry1.bindValue(":InsFname",fname); qry1.bindValue(":InsMname",mname); qry1.bindValue(":InsLname",lname); qry1.bindValue(":DepartmentID",departmentId); if(qry1.exec()){ QMessageBox::information(this,"Added", "Data Added Successfully"); } else{ qDebug() << "add data failed: " << qry1.lastError(); } dr.CloseDBConnection(); }
应急方案:提交时临时查询数据库获取ID
如果你不方便修改下拉框初始化逻辑,可以用这种方案,缺点是会多一次数据库查询,且如果部门名称重复会有匹配错误问题:
void addteacherform::on_newTeacherButton_clicked() { dbRepository dr; dr.OpenDBConnection(); //retrieve data from field QString fname = ui->firstnameEdit->text(); QString mname = ui->middleIEdit->text(); QString lname = ui->lastnameEdit->text(); QString deptName = ui->DepartmentCombo->currentText(); // 先查部门表拿对应ID QSqlQuery deptQry; deptQry.prepare("SELECT DepartmentID FROM DepartmentTbl WHERE DepartmentName = :deptName"); deptQry.bindValue(":deptName", deptName); int departmentId = 0; if(deptQry.exec() && deptQry.next()) { departmentId = deptQry.value(0).toInt(); } else { qDebug() << "查询部门ID失败:" << deptQry.lastError(); dr.CloseDBConnection(); return; } //insert query QSqlQuery qry1; qry1.prepare("INSERT INTO InstructorTbl (InsFname, InsMname, InsLname, DepartmentID)" "VALUES (:InsFname, :InsMname, :InsLname,:DepartmentID)"); qry1.bindValue(":InsFname",fname); qry1.bindValue(":InsMname",mname); qry1.bindValue(":InsLname",lname); qry1.bindValue(":DepartmentID",departmentId); if(qry1.exec()){ QMessageBox::information(this,"Added", "Data Added Successfully"); } else{ qDebug() << "add data failed: " << qry1.lastError(); } dr.CloseDBConnection(); }
注意事项
- 请把代码中的
DepartmentID、DepartmentName字段名替换为你自己DepartmentTbl表中实际的字段名 - 如果部门名称存在重复的情况,必须用第一种预绑定ID的方案,否则会出现匹配错误
内容的提问来源于stack exchange,提问作者Clariss
相关产品推荐
相关产品推荐

