PyQt记住UI状态/项目

flo*_*510 3 python settings pyqt

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

所以对于例如.如果我双击" 项目1在treewidget'选择在检查和组合框在屏幕2的一些选项和返回屏幕1,选择’ 项目2 ",其中,这个时候我选择一组不同的组合项目等.在回去再次到第一个屏幕并双击' Item1 ',我应该恢复之前与之关联的选项.

希望这是有道理的.我需要最好的方法帮助,一些代码示例会很棒.

真的很感激任何帮助.

ekh*_*oro 6

所有树窗口小部件项都有一个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])
            ...
Run Code Online (Sandbox Code Playgroud)

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

    settings = self.saveSettings()
    item.setData(0, QtCore.Qt.UserRole, settings)
Run Code Online (Sandbox Code Playgroud)

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

    settings = item.data(0, QtCore.Qt.UserRole)
    self.restoreSettings(settings)
Run Code Online (Sandbox Code Playgroud)

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

    settings = item.data(0, Qt.QtCore.Qt.UserRole).toPyObject()
Run Code Online (Sandbox Code Playgroud)

或者,你可以摆脱QVariant任何地方,但把它放在你的程序的开头:

    import sip
    sip.setapi('QVariant', 2)
    from PyQt4 import ... etc
Run Code Online (Sandbox Code Playgroud)