QSplitter.sizes表示大小错误

时间:2015-03-01 15:27:44

标签: python pyqt qsplitter

我保存了我的一个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)
  • sizes_splitter2:[321,844,743]
  • self.splitter2.sizes():[224,590,519]

编辑2: 当我保存分割器时,我也这样做(自我是QMainWIndow):

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

如果我对这些行进行注释,splitter.sizes()将返回正确的值。 但是这两行完成了它们的工作,窗口恢复到合适的尺寸!

2 个答案:

答案 0 :(得分:0)

.restoreState()的{​​{3}}表示您必须将返回的值重新转换为ByteArrayQSettings可以返回Variant类型,而不是同一类型正如你最初设定的那样)。

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

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

答案 1 :(得分: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_())