1

我像这样保存我的一个 QSplitter 的状态:

self.options.setValue("Window/final_splitter", self.splitter2.saveState())

我像这样恢复它:

self.splitter2.restoreState(self.options.value("Window/final_splitter"))

当我保存拆分器时, splitter2.sizes() 表示: [321, 818, 769]

当我恢复分离器时,它在视觉上与我关闭它时的尺寸相同,但 splitter2.sizes() 表示: [224, 572, 537]

而且我无法对拆分器执行更多操作,因为我无法获得正确的大小。

您对如何解决此错误有任何想法吗?

编辑:更奇怪的是:

保存:

self.options.setValue("Window/final_splitter", self.splitter2.sizes())

-> self.splitter2.sizes(): [321, 844, 743]

恢复:

sizes_splitter2 = [int(nbr) for nbr in self.options.value("Window/final_splitter", [])]
self.splitter2.setSizes(sizes_splitter2)
  • size_splitter2: [321, 844, 743]
  • self.splitter2.sizes(): [224, 590, 519]

编辑 2:当我保存拆分器时,我也会这样做(self 是 QMainWINdow):

self.options.setValue("window_geometry", self.saveGeometry())
self.options.setValue("window_state", self.saveState())

如果我评论这些行, splitter.sizes() 会返回好的值。但是那两条线完成了它们的工作,窗口与它们一起恢复到正确的大小!

4

2 回答 2

0

我猜您正在尝试在窗口完全显示之前查询拆分器的大小。

解决此问题的一种方法是在事件循环开始后使用单次计时器执行进一步的操作。

希望这个演示脚本应该显示发生了什么:

from PyQt4 import QtCore, QtGui

class Window(QtGui.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        widget = QtGui.QWidget(self)
        layout = QtGui.QVBoxLayout(widget)
        self.setCentralWidget(widget)
        self.splitter = QtGui.QSplitter(self)
        self.splitter.addWidget(QtGui.QTextEdit(self))
        self.splitter.addWidget(QtGui.QTextEdit(self))
        self.splitter.addWidget(QtGui.QTextEdit(self))
        self.button = QtGui.QPushButton('Test', self)
        self.button.clicked.connect(lambda: self.printSizes('Test'))
        layout.addWidget(self.splitter)
        layout.addWidget(self.button)
        self.printSizes('Show Before')
        settings = self.settings()
        value = settings.value('splitter')
        if value is not None:
            self.splitter.restoreState(value)
        value = settings.value('layout')
        if value is not None:
            self.restoreState(value)
        value = settings.value('geometry')
        if value is not None:
            self.restoreGeometry(value)
        self.printSizes('Show After')
        QtCore.QTimer.singleShot(
            20, lambda: self.printSizes('Timer'))

    def closeEvent(self, event):
        self.printSizes('Close')
        settings = self.settings()
        settings.setValue("splitter", self.splitter.saveState())
        settings.setValue("geometry", self.saveGeometry())
        settings.setValue("layout", self.saveState())

    def settings(self):
        return QtCore.QSettings(
            QtCore.QSettings.IniFormat,
            QtCore.QSettings.UserScope, 'test', 'test')

    def printSizes(self, message):
        print('%s:' % message)
        print('  window geometry:', (
            self.width(), self.height(), self.x(), self.y()))
        print('  splitter sizes:', self.splitter.sizes())
        print()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
于 2015-03-01T20:49:53.350 回答
0

文档表明.restoreState()您必须将返回的值重新转换为ByteArray(QSettings可以返回Variant类型,与您最初设置的类型不同)。

self.splitter.restoreState(self.options.value("final_splitter").toByteArray())

值得注意的是,QSettings不同版本的 PyQt/PySide 和不同平台上的行为有所不同,但以上应该适用于所有情况。

于 2015-03-01T17:10:05.413 回答