【问题标题】:PyQt remembering UI states/ itemsPyQt 记住 UI 状态/项目
【发布时间】:2014-01-31 20:49:05
【问题描述】:

我正在使用QStackedWidget,在屏幕 1 上,我有一个带有项目列表的 QTreeWidget,而屏幕 2 有一些组合框和复选框。双击树小部件中的一个项目会将我带到屏幕 2。我想做的是开发一种方法来记住所选设置。

例如。如果我双击树小部件中的“Item1”,请在屏幕 2 的复选框和组合框中选择一些选项,然后返回屏幕 1 并选择“Item2”,其中当我选择一组不同的组合项目等时。再次返回第一个屏幕并双击“Item1”,我应该恢复之前与之关联的选项。

希望这是有道理的。我需要有关最佳方法的帮助,并且一些代码示例会很棒。

非常感谢任何帮助。

【问题讨论】:

  • 您能发布您的代码以获取建议
  • 我的代码太大,这里无法粘贴,这里的查询只是其中的一小部分。为了在这篇文章中展示它,我必须把它剪掉。 ekhumoros 下面的答案虽然效果很好

标签: python pyqt settings


【解决方案1】:

所有树小部件项都有一个setData 方法,您可以使用它来存储相关值,在这种情况下,它只是一个包含设置的dict

为了使保存和恢复设置更容易,建议确保所有复选框、组合框等都有一个共同的父级,并且它们都被赋予一个唯一的objectName。这样,它就可以很容易地迭代它们:

    def saveSettings(self):
        settings = {}
        for child in self.settingsParent.children():
            name = child.objectName()
            if not name:
                continue
            if isinstance(child, QtGui.QCheckBox):
                settings[name] = child.isChecked()
            elif isinstance(child, QtGui.QComboBox):
                settings[name] = child.currentIndex()
            ...
        return settings

    def restoreSettings(self, settings):
        for child in self.settingsParent.children():
            name = child.objectName()
            if name not in settings:
                continue
            if isinstance(child, QtGui.QCheckBox):
                child.setChecked(settings[name])
            elif isinstance(child, QtGui.QComboBox):
                child.setCurrentIndex(settings[name])
            ...

要将设置添加到树小部件项目,您只需执行以下操作:

    settings = self.saveSettings()
    item.setData(0, QtCore.Qt.UserRole, settings)

要检索它们,请执行以下操作:

    settings = item.data(0, QtCore.Qt.UserRole)
    self.restoreSettings(settings)

但请注意,如果您使用的是 python2,则可能需要在此处采取额外的步骤,因为 data 将返回 QVariant,而不是 dict。如果是这种情况,要获得dict,您需要这样做:

    settings = item.data(0, Qt.QtCore.Qt.UserRole).toPyObject()

或者,您可以在任何地方删除 QVariant,但将其放在程序的开头:

    import sip
    sip.setapi('QVariant', 2)
    from PyQt4 import ... etc

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2011-12-10
    • 2017-10-07
    相关资源
    最近更新 更多