来自数据库的 QT ComboBox ItemData
Posted
技术标签:
【中文标题】来自数据库的 QT ComboBox ItemData【英文标题】:QT ComboBox ItemData from Database 【发布时间】:2014-12-11 16:56:08 【问题描述】:我有以下代码将 QT QComboBox
链接到我的 sqlite 数据库,并且效果很好。
但是,在我的数据库中,我有与外键链接的 Category 和 Item 表。
因此,当我从 QComboBox
提取信息时,我需要获取 Category_ID
而不是框中列出的名称。
我将如何使用模型将 QComboBox
ItemData 设置为 Category_ID
字段,或者更好地使用模型将 QComboBox
ItemData 设置为我的类别对象?
谢谢,
void MainWindow::populatCat()
QSqlQueryModel *model = new QSqlQueryModel();
QString sql;
sql = "select Category_Name From Category ORDER BY Category_Name ASC;";
QSqlQuery* query = new QSqlQuery(db);
query->prepare(sql);
if(!query->exec())
qDebug () << "Query Erorr: " << query->lastError();
else
qDebug () << "Query Successful: " << query->lastQuery();
model->setQuery(*query);
ui->cboCat->setModel(model);
【问题讨论】:
为什么不在查询中获取 Category_Name 和 Category_ID。将两者都存储在 std::map好的,我现在就给出答案。 :)
QComboBox* myBox = new QComboBox();
connect( myBox, SIGNAL( indexChanged( int ) ), this, SLOT( handleIndexChange( int ) ) );
void myObject::handleIndexChange( int /*index*/ )
// We actually don't need the index
QComboBox* box = qobject_cast<QComboBox*>( sender() );
if ( box )
QVariant data = box->currentData(); // do whatever w/ data... sounds like call toInt() in your case.
我所有三种方法的本质是,您必须做一些额外的事情来获取与更改后的当前项目相对应的 data() 。如果它发出一个将基础数据作为参数的信号会很好,但这可能会变得很昂贵。
【讨论】:
是否可以根据 indexChanged 中的类别名称进行查询以填充数据,或者我应该更改 populateCat 函数以解析所有数据并在启动时加载组合框? 无论如何我都不是 DBA,我无法在没有更多信息的情况下给您一个好的答案,但是与通过已缓存数据进行查找相比,数据库查询非常慢(而且很贵)——通常,无论如何。真的取决于很多事情:记录数量和延迟容忍度将是主要的两个。您还需要考虑您的数据库执行搜索的速度有多快或多慢。 K 谢谢,我必须对我正在构建的应用进行一些研究和测试才能决定以上是关于来自数据库的 QT ComboBox ItemData的主要内容,如果未能解决你的问题,请参考以下文章
QT软件开发之基础控件--2.4.2 comboBox下拉框