【问题标题】:PyQt5 attach data to QComboBox itemPyQt5 将数据附加到 QComboBox 项
【发布时间】:2021-03-05 07:15:18
【问题描述】:

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

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

我似乎记得有一种方法可以将自定义数据附加到 Qt 中的几乎任何东西,但我找不到信息(而且我可能对其他框架感到困惑;我已经多年没有接触 Qt)了。

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

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

【问题讨论】:

    标签: pyqt5 qcombobox


    【解决方案1】:

    不,您不能在 Designer 中“静态”设置数据,至少使用标准 QComboBox 控件。

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

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

    基本规则是在 Qt 上你只能设置小部件 properties(Qt 属性,在每个类的文档的“属性”部分中列出的那些),并且对于具有内部模型的小部件(如 QComboBox 或更高级别的视图,如 QListWidget)只有基本数据角色可用:基本上,文本和图标,加上字体/对齐、前景/背景、工具提示/whatsthis 和项目视图的标志/检查状态。

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

    如果您想更一致地访问 QComboBox 中的项目数据,您可以使用 dict 对其进行初始化,然后访问其model()(默认为QStandardItemModel),或者,最终,使用 dict 自行创建模型并使用 setModel

    【讨论】:

    • 感谢您的解释。有没有办法将数据附加到通用 QWidget(没有子类化)?具体(当前)案例是将一些数据附加到 QTabWidget 中的页面,但问题当然更笼统。 TiA
    • @ZioByte 是的,您可以在任何继承自 QObject 的类上使用 setProperty(name, value)(显然,这也意味着所有 QWidget 子类)。您也可以在 Designer 中使用动态属性,因此您可以为添加到 QTabWidget 的每个小部件设置一个属性。只需在 Designer 的对象检查器中选择小部件,然后单击属性编辑器中的“+”按钮即可添加属性。如前所述,只能使用基本的 [QVariant] 类型。
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多