来自数据库的 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 (Category_Name 作为键)之类的东西中。创建一个接收 const QString& 并连接到 QComboBox 的 currentIndexChanged( const QString& ) 信号的插槽。在 slot 内,在 map 中查找 key,并获取 Category_ID。 其实这可能不是最好的方法。但是,我认为您将不得不进行某种查找,因为它发出的唯一内容是文本或索引。 【参考方案1】:

好的,我现在就给出答案。 :)

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 基于 ComboBox1 改变 ComboBox2

Qt 按键控制combobox

Qt 学习笔记 2. ComboBox

QT软件开发之基础控件--2.4.2 comboBox下拉框

Qt 5.5 使用 C++,从 ComboBox 中删除和项目正在删除项目之前的所有项目

QT中ComboBox如何获取选中的文本内容??下面程序出错了,如何改正?