QCombobox 与字符串旁边的项目的附加数据

QCombobox with additional data for items next to the string

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

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

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

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

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

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

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

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

我预计这还需要更改当前数据过程才能实际获取第二个变量。 所以我认为使用 array/vector/struct:

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

但我不确定如何将 array/vector/struct 作为 QVariant。

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

您可以从 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();