【问题标题】:QCombobox with additional data for items next to the string带有字符串旁边项目的附加数据的 QCombobox
【发布时间】:2019-09-04 09:34:32
【问题描述】:

我有一个包含两种类型的数据库。假设我有动物,然后这两种类型是鸟类和鱼类。我想要一个将两者结合在一起的组合框。所以基本上你可以选择任何动物,无论是鸟还是鱼。

在组合框中,我想显示数据库中所有动物的名称,但我还想在名称旁边的每个项目中添加一些额外的数据,以用于编程。我想添加索引和类型。

在我使用 userdata 变量添加索引之前,我只有一种新类型,它应该在哪个数据库之后查询。 (请参阅 QCombobox 文档:addItem(const QString &text, const QVariant &userData = QVariant()))。所以我当时做的是:

ui.comboBox->addItem("Animal name", animal_index);

我不确定这是否是 userdata 变量的目的,但这样它就完成了我想要它做的事情。当按下 OK 按钮时,我可以读取当前数据并使用它来查询数据库中该动物的所有属性。

但我现在想要的是向组合框项添加两个额外的信息变量。这样我就知道我应该查询哪个数据库表来获取动物属性。

所以我要么希望能够做类似的事情:

ui.comboBox->addItem("Animal name", animal_index, animal type);

我预计这也需要更改当前数据过程才能实际获得第二个变量。 所以我认为更好的是使用数组/向量/结构:

ui.comboBox->addItem("Animal name", [animal_index, animal type]);

但我不确定如何将数组/向量/结构设为 QVariant。

我知道我也可以在索引中创建范围。所以所有鸟类的指数都在 0 到 999 之间,所有鱼的指数都在 1000 到 1999 之间。但这需要一些我不想要的额外数据库管理。

【问题讨论】:

    标签: c++ qt qcombobox


    【解决方案1】:

    您可以从QList 构造一个变体并将其设置为用户数据。例如:

    ui.comboBox->addItem("Animal name",
                         QList<QVariant>() << animal_index << animal_type);
    

    要读回项目数据,您可以这样做:

    auto data = ui.comboBox->itemData(0).value<QList<QVariant>>();
    assert(data.size() == 2);
    auto animal_index = data.first().toInt();
    auto animal_type = data.last().toInt();
    

    【讨论】:

    • 使用auto data = ui.comboBox-&gt;itemData(0).value&lt;QList&lt;QVariant&gt;&gt;();QList&lt;QVariant&gt; data = ui.comboBox-&gt;itemData(0).value&lt;QList&lt;QVariant&gt;&gt;();有什么区别吗?
    • 不同的是你显式声明了data的类型。你也可以这样写。在这种情况下没有问题。
    猜你喜欢
    • 2021-03-05
    • 2021-08-25
    • 2018-05-04
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多