如何从Qt Designer/.ui文件向QComboBox添加项目数据

17

我正在使用Qt Designer(实际上是Qt Creator,但特别是从Qt Designer派生的部分),并在对话框中添加了一些具有常量列表项目的QComboBox项。我需要将组合框中的项目映射到字符串(这些字符串与显示的字符串不同)。我想到最好的方法是使用QComboBox :: itemData 函数从选定的项目获取所需的字符串,但我遇到了向项目添加相关字符串的麻烦。我已经在设计器上到处寻找,但尚未找到一种添加用户数据的方式。我是否错过了其中一个?如果需要,我也愿意直接编辑.ui文件的XML以添加属性,但我无法弄清楚属性名称是什么。我可以在这里使用一个吗?目前,我正在通过代码添加数据,但我认为这不是正确的解决方案。


考虑到项目数据是QVariant类型,似乎不太可能在Qt Designer中实现这一点。而且我认为在代码中填充组合框并没有什么错误或不寻常的地方。 - ekhumoro
我不确定。几乎任何属性都是QVariant,类型选择决定了QVariant中的值类型。这就是动态属性的工作原理,例如如果您在设计器中添加属性并使用QObject::property访问它。至于为什么我不想将其放入代码文件中,因为将项实例化和数据实例化分开似乎是一种不好的做法,因为这使得添加/编辑项更加麻烦。 - LRFLEW
数据必须被序列化为XML,这就是为什么我认为它不太可能得到支持(但原则上并非不可能)。很抱歉我不明白你为什么认为在代码中填充组合框是“不好的实践”或者繁琐。 - ekhumoro
我在代码中填充组合框。组合框的项目是在.ui文件中设置的。它与之关联的数据是在代码中设置的。因此,项目及其文本位于.ui文件中,而数据位于单独的源文件中。 - LRFLEW
啊 - 好吧,我实际上建议您在代码中填充文本和数据。我同意分别填充它们不是一个好的解决方案。 - ekhumoro
5个回答

35

编辑:因为这个答案似乎得到了比应该得到的更多的赞,我将把它留在这里,因为许多人似乎会在谷歌上搜索他们的问题时找到这个答案。下面的答案更适合于原作者的问题。

在QT designer 5.6.2中,您可以双击组合框来添加项目。


谢谢,这个答案很有用并且更加更新。 - Isma
10
这回答了一个错误的问题。是的,您可以以这种方式向QComboBox添加更多元素,但那不是我要问的。我想问的是如何设置已添加项目的项数据。http://doc.qt.io/qt-5/qcombobox.html#setItemData在Qt Designer中不支持设置自己的Qt :: UserRole数据。您只能编辑每个元素的文本和图标数据。 - LRFLEW
1
这是关于向每个项目添加 QVariant 数据,而不是添加项目本身。如果需要手动添加数据,则最好也添加项目。 - Keshav Sahu
1
@KeshavSahu 我的回答中的斜体免责声明已经完全理解和涵盖了这一点。 - Dschoni
1
这就是我一直在寻找的答案。不过,我不是 OP :D - Dženan

16

好的,我实际上已经浏览了UIC源代码,并找到了处理QComboBox的位置。截至Qt当前版本(即5.5.1),没有通过.ui文件设置项目数据属性的支持。我可能会将其作为一个功能请求,但现在还不支持。


3
这是如何在每个ComboBox项目中存储数据,除了文本以外的方式。
item_text = 'This is my text'
item_data = []
your_comboBox.addItem(item_text, item_data)

获取数据的方式:

item_index = 0
y_data = your_comboBox.itemData(item_index)

1

具有讽刺意味的是,您链接的错误报告是我在提出这个问题后不久开启的那个。我从未在此线程中发布过它,所以感谢您这样做。 - LRFLEW

-1

运行时添加项目:

ui.ComboBox.addItem('My New Combo Box Item')

使用字典将组合框映射到字符串:

lookup_dictionary[ui.ComboBox.currentText()]

这种方式不具备翻译的弹性。(而且是不必要的,因为我们有像setItemData这样的方法) - Ben Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接