ComBoBox添加到状态栏,添加的数据无法显示

本文介绍了解决CComBoBox控件在状态栏上显示数据时遇到的问题,通过调整矩形区域的高度来确保控件能正确显示插入的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天应该算是我到公司第一次真的编程吧!我看了一些视频作为参考,基本也做到了将CComBoBox的对象添加到状态栏的新加的区域上去并显示,可是当我向CComBoBox的对象中插入了数据之后发现数据竟然无法显示,但在创建的时候如果设定一个固定的CRect的矩形区域的时候却可以显示插入的值?

后来才知道原来是因为动态获取的CRect的矩形区域的高度不够,此时动态获取的矩形区域用来存放CComBoBox的控件的时候,矩形区域的高度就是控件的总体(包括下拉部分)高度,故此时数据根本无法显示,就会觉得没有显示数据(实际上有数据显示不过我们没有看到而已)。

void CMainFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CFrameWnd::OnPaint()
CRect rect;
// CRect rect1(881,2,959,72);
m_wndStatusBar.GetItemRect(2,&rect);
rect.top=0;
rect.bottom += 75; *********//给combobox高度适当增加
rect.right+=20;
if (!m_comBoBox.m_hWnd){ 

m_comBoBox.Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST,
rect, &m_wndStatusBar, 1);
m_comBoBox.SetItemHeight(-1,15);
InsertToCom(5);
m_comBoBox.SetCurSel(0);//Selects a string in the list box of a combo box.设置combobox的初始默认值

/*获取当前选择项的值;

int selIndex=m_comBoBox.GetCurSel();
CString selValue;
m_comBoBox.GetLBText(selIndex,selValue);
MessageBox(selValue);

*/


else
{
m_comBoBox.MoveWindow(rect);
}
CFrameWnd::OnPaint();
}

void CMainFrame::InsertToCom(int p){
CString m_comStr;
for (int i=0;i<p;++i)
{
m_comStr.Format("num:%d",i);
m_comBoBox.InsertString(0,m_comStr);
}
}

如果想动态获取的矩形区域可以将CComBoBox的对象及插入的值都显示出来,则可以将矩形区域的bottom值增加适当。

<think>好的,用户现在需要在仪器类别栏(即设备类别下拉框)添加示例类别。首先,我需要回顾之前的代码,特别是`loadEquipmentClasses`函数,这个函数负责从数据库加载设备类别到下拉框。用户的需求是添加示例类别,可能有两种情况:一种是数据库中没有示例数据,需要手动添加;另一种是在加载时除了数据库的数据外,额外添加示例类别。 首先,用户可能希望下拉框中显示一些预设的示例类别,比如“显微镜”、“离心机”等,即使数据库中没有这些数据。或者,用户可能希望在数据库初始化时插入这些示例类别,然后通过`loadEquipmentClasses`加载。 根据之前的代码,`loadEquipmentClasses`函数从数据库查询`equipment_class`表的`id`和`name`,然后添加到下拉框。如果数据库中没有示例数据,下拉框只会显示“请选择设备类别”。因此,需要修改`loadEquipmentClasses`函数,在从数据库加载的基础上,或者在数据库为空时,添加示例类别。 可能的步骤包括: 1. 检查数据库中`equipment_class`表是否有数据。如果没有,插入示例类别。 2. 或者,在加载下拉框时,无论数据库是否有数据,都添加示例类别作为选项。 但更合理的做法是在数据库初始化时插入示例数据,这样`loadEquipmentClasses`可以直接加载。如果用户希望即使数据库为空,下拉框也有示例,可能需要手动添加。 另外,用户可能希望示例类别是临时的,不保存到数据库,或者作为默认数据保存。需要明确需求,但根据问题描述,“添加示例类别”可能指在下拉框中显示示例,比如在加载时添加。 因此,修改`loadEquipmentClasses`函数,在从数据库加载后,或者如果数据库无数据添加示例类别。例如: - 如果数据库查询结果为空,添加示例类别(如“显微镜”、“离心机”)到下拉框。 - 或者,无论数据库是否有数据,都添加示例类别作为可选选项(可能需要处理重复)。 另外,需要确保示例类别的`id`合理,比如自增或临时值,但可能用户只需要显示名称,`id`可以是临时的,但实际插入数据库时需要有效`id`,所以可能需要数据库中有这些示例类别的记录。 因此,更可靠的方法是在数据库初始化时插入示例类别,然后`loadEquipmentClasses`正常加载。如果用户希望代码中自动添加示例,可能需要在`loadEquipmentClasses`中检查数据库是否有数据,如果没有则插入示例,再加载。 现在,根据用户的问题,需要修改`.cpp`代码,在仪器类别栏添加示例类别。假设用户希望下拉框中显示示例类别,比如“显微镜”、“离心机”、“培养箱”,即使数据库中没有这些数据,或者作为默认选项。 可能的修改是在`loadEquipmentClasses`函数中,在从数据库加载后,如果结果为空,添加示例类别。或者,直接添加示例类别到下拉框,不管数据库是否有数据。 例如,修改`loadEquipmentClasses`如下: void kaddmanage::loadEquipmentClasses() { service::DatabaseManager db(data::Equipment::path); QString query = "SELECT id, name FROM equipment_class"; auto results = db.executeQueryAndFetchAll(query); ui->comboBox->clear(); ui->comboBox->addItem("请选择设备类别", -1); if (results.isEmpty()) { // 数据库无数据添加示例类别 ui->comboBox->addItem("显微镜", 1); // 假设id为1 ui->comboBox->addItem("离心机", 2); ui->comboBox->addItem("培养箱", 3); } else { // 加载数据库中的类别 for (const auto &row : results) { int classId = row["id"].toInt(); QString className = row["name"].toString(); ui->comboBox->addItem(className, classId); } } } 或者,如果用户希望示例类别始终显示在下拉框中,即使数据库有数据,可以在循环后添加: // 加载数据库中的类别 for (const auto &row : results) { ... } // 添加示例类别(可选,避免重复) ui->comboBox->addItem("显微镜", 999); // 使用特殊id,如999表示示例 但需要注意,如果数据库中已有这些类别,可能会重复,所以更好的方法是初始化数据库时插入示例数据。 另外,用户可能希望示例类别是数据库中的默认数据,因此可能需要在应用首次运行时初始化数据库,插入示例类别。这可能需要额外的代码,但用户的问题可能只需要在下拉框中显示示例,所以修改`loadEquipmentClasses`函数即可。 综上,修改后的`loadEquipmentClasses`函数会在数据库无数据添加示例类别,或者直接添加示例类别作为选项,确保用户看到示例。 </think> ### 修正后的 `.cpp` 代码(仪器类别栏添加示例类别) 以下修改在 `loadEquipmentClasses` 函数中实现:当数据库中无设备类别数据时,自动添加示例类别(如“显微镜”“离心机”“培养箱”)到下拉框,确保用户可直接选择示例。 #### **关键修改部分(`loadEquipmentClasses` 函数)** ```cpp void kaddmanage::loadEquipmentClasses() { service::DatabaseManager db(data::Equipment::path); QString query = "SELECT id, name FROM equipment_class"; auto results = db.executeQueryAndFetchAll(query); // 从数据库查询设备类别 ui->comboBox->clear(); // 清空下拉框原有内容 ui->comboBox->addItem("请选择设备类别", -1); // 默认提示项(值为-1表示未选择) if (results.isEmpty()) { // 数据库无设备类别数据时,添加示例类别(硬编码) ui->comboBox->addItem("显微镜", 1); // 示例1:名称为"显微镜",id设为1 ui->comboBox->addItem("离心机", 2); // 示例2:名称为"离心机",id设为2 ui->comboBox->addItem("培养箱", 3); // 示例3:名称为"培养箱",id设为3 } else { // 数据库有数据时,正常加载数据库中的类别 for (const auto &row : results) { int classId = row["id"].toInt(); QString className = row["name"].toString(); ui->comboBox->addItem(className, classId); // 添加"名称-ID"对 } } } ``` ### **完整 `.cpp` 代码** ```cpp #include "view/equipmentManage/kaddmanage.h" #include <QMessageBox> #include "service/database/databaseManager.h" // 数据库操作类 kaddmanage::kaddmanage(QWidget *parent) : QDialog(parent), ui(new view::equipment::Ui::kaddmanage) { ui->setupUi(this); // 初始化UI(自动创建ui中的所有控件) // 初始化设备类别和状态下拉框(直接操作UI中的comboBoxcomboBox_2) loadEquipmentClasses(); // 加载设备类别到ui->comboBox(含示例逻辑) initStatusOptions(); // 初始化状态选项到ui->comboBox_2 } kaddmanage::~kaddmanage() { delete ui; // 释UI指针 } void kaddmanage::loadEquipmentClasses() { service::DatabaseManager db(data::Equipment::path); QString query = "SELECT id, name FROM equipment_class"; auto results = db.executeQueryAndFetchAll(query); // 从数据库查询设备类别 ui->comboBox->clear(); // 清空下拉框原有内容 ui->comboBox->addItem("请选择设备类别", -1); // 默认提示项(值为-1表示未选择) if (results.isEmpty()) { // 数据库无设备类别数据时,添加示例类别(硬编码) ui->comboBox->addItem("显微镜", 1); // 示例1:名称为"显微镜",id设为1 ui->comboBox->addItem("离心机", 2); // 示例2:名称为"离心机",id设为2 ui->comboBox->addItem("培养箱", 3); // 示例3:名称为"培养箱",id设为3 } else { // 数据库有数据时,正常加载数据库中的类别 for (const auto &row : results) { int classId = row["id"].toInt(); QString className = row["name"].toString(); ui->comboBox->addItem(className, classId); // 添加"名称-ID"对 } } } void kaddmanage::initStatusOptions() { // 初始化设备状态下拉框(ui->comboBox_2)的选项 ui->comboBox_2->clear(); ui->comboBox_2->addItems({"可用", "维修中", "报废"}); // 直接添加文本选项 ui->comboBox_2->setCurrentText("可用"); // 默认选中"可用" } void kaddmanage::on_addButton_clicked() { // 从UI控件获取输入(直接通过ui访问) QString equipmentId = ui->equipmentIdEdit->text().trimmed().replace("'", "''"); // 转义单引号 QString name = ui->equipmentNameEdit->text().trimmed().replace("'", "''"); // 转义单引号 QString quantityStr = ui->quantityEdit->text().trimmed(); // 添加个数(无需转义) QString batchNumber = ui->batchNumberEdit->text().trimmed().replace("'", "''"); // 转义单引号 int classId = ui->comboBox->currentData().toInt(); // 设备类别ID(数值) QString status = ui->comboBox_2->currentText().replace("'", "''"); // 转义单引号 // 输入校验 if (equipmentId.isEmpty()) { QMessageBox::warning(this, "错误", "仪器标识符不能为空!"); return; } if (name.isEmpty()) { QMessageBox::warning(this, "错误", "仪器名称不能为空!"); return; } bool isNum; int quantity = quantityStr.toInt(&isNum); if (!isNum || quantity <= 0) { QMessageBox::warning(this, "错误", "添加个数必须为正整数!"); return; } if (classId == -1) { QMessageBox::warning(this, "错误", "请选择有效的设备类别!"); return; } // 数据库插入逻辑(适配单参数 executeNonQuery) service::DatabaseManager db(data::Equipment::path); db.beginTransaction(); bool allSuccess = true; QString errorDetails; for (int i = 0; i < quantity; ++i) { // 生成最终设备标识符(数量>1时添加后缀) QString finalEquipmentId = (quantity > 1) ? QString("%1_%2").arg(equipmentId).arg(i + 1).replace("'", "''") // 转义单引号 : equipmentId; // 手动拼接 SQL 语句(字符串参数用单引号包裹,数值直接拼接) QString insertQuery = QString(R"( INSERT INTO equipment_instance ( equipment_id, name, class_id, status, batch_number ) VALUES ( '%1', '%2', %3, '%4', '%5' ) )").arg( finalEquipmentId, // 设备标识符(字符串,已转义) name, // 设备名称(字符串,已转义) QString::number(classId), // 类别ID(数值,无需引号) status, // 状态(字符串,已转义) batchNumber // 批次号(字符串,已转义) ); // 调用单参数 executeNonQuery(仅传递拼接后的 SQL 语句) if (!db.executeNonQuery(insertQuery)) { allSuccess = false; errorDetails += QString("第%1条记录插入失败:%2\n").arg(i + 1).arg(db.getLastError()); break; // 失败后终止循环(可根据需求改为继续但记录错误) } } if (allSuccess) { db.commitTransaction(); QMessageBox::information(this, "成功", QString("已成功添加%1个设备实例!").arg(quantity)); emit dataAdded(); // 发送信号通知主界面刷新 this->close(); // 关闭当前窗口 } else { db.rollbackTransaction(); QMessageBox::critical(this, "失败", QString("添加失败(%1/%2条成功):\n%3").arg(quantity - errorDetails.count('\n')) .arg(quantity) .arg(errorDetails)); } } ``` ### **修改说明** 1. **示例类别添加逻辑** 在 `loadEquipmentClasses` 函数中,首先从数据库查询设备类别数据(`equipment_class` 表)。若查询结果为空(数据库无类别数据),则手动添加示例类别(“显微镜”“离心机”“培养箱”)到下拉框,确保用户可直接选择示例。 2. **示例类别 ID 处理** 示例类别硬编码为 `id=1`、`id=2`、`id=3`(实际项目中建议与数据库自增 ID 规则一致,或首次运行时自动初始化数据库示例数据)。 3. **兼容性保留** 若数据库已有设备类别数据(如通过其他方式初始化),则正常加载数据库中的类别,示例逻辑不会干扰现有数据。 ### **验证步骤** 1. **数据库无类别数据时** 清空 `equipment_class` 表,运行程序,检查下拉框是否显示“显微镜”“离心机”“培养箱”三个示例类别。 2. **数据库有类别数据时** 向 `equipment_class` 表插入真实数据(如 `id=4`,`name=PCR仪`),运行程序,检查下拉框是否加载真实数据(而非示例)。 3. **选择示例类别测试** 选择示例类别(如“显微镜”),填写其他字段并点击“添加”,验证数据库 `equipment_instance` 表中 `class_id` 是否为示例的 `id`(如 `1`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值