PyQt5 将数据附加到 QComboBox 项目

PyQt5 attach data to QComboBox item

是否可以将通用数据附加到每个 QComboBox 项目,以便我可以根据当前选择检索它?

我知道我可以构建一个 dict 以组合项目作为键,但这相当脆弱,因为它会在任何项目编辑时中断。

我似乎记得有一种方法可以将自定义数据附加到 Qt 中的几乎所有内容,但我无法找到信息(而且我可能会混淆其他框架;多年来我没有接触 Qt)。

我似乎明白我可以使用 addItem(text, userData) 动态添加项目;我可以在 Qt Designer 中静态地做同样的事情吗?

最理想的是能够直接在 Qt Designer 中附加数据并能够在 currentIndexChanged 处理程序中检索它。

不,您不能在 Designer 中“静态”设置数据,至少对于标准 QComboBox 控件是这样。

这是因为一个项目的 itemData() 可以是 任何 种数据,而 Qt 本身支持“有限”范围的数据类型,如 QVariants,虽然在 PyQt 上似乎可以添加任意类型的数据,但事实是 PyQt 在内部尝试将可识别的类型转换为它自己的类型,然后退回到私有 PyQtObject 来封装其他内容(python object 子classes).

使用提升的小部件或自定义 Designer 插件有一些可能性,但以正确的方式实施类似的方法通常是不值得的。

基本规则是,在 Qt 上您只能设置小部件 properties(Qt 属性,在每个 class 的文档的“属性”部分中列出的属性) ),对于具有内部模型的小部件(如 QComboBox 或更高级别的视图,如 QListWidget),只有基本数据角色可用:基本上,文本和图标,加上 font/alignment、foreground/background、tooltip/whatsthis 和 flags/checkstate 用于项目查看。

任何其他“属性”(不是实际 属性),例如自定义角色的项目数据只能通过编程方式设置。

如果你想更一致地访问 QComboBox 中的项目数据,你可以只使用 dict 初始化它,然后访问它的 model() (which by default is a QStandardItemModel), or, eventually, create a model on your own using the dict and use setModel.