Python QSplitter.size表示错误的大小

Python QSplitter.size表示错误的大小,python,pyqt,qsplitter,Python,Pyqt,Qsplitter,我保存一个Qspliter的状态如下: self.options.setValue("Window/final_splitter", self.splitter2.saveState()) self.splitter2.restoreState(self.options.value("Window/final_splitter")) 我这样还原它: self.options.setValue("Window/final_splitter", self.splitter2.saveState(

我保存一个Qspliter的状态如下:

self.options.setValue("Window/final_splitter", self.splitter2.saveState())
self.splitter2.restoreState(self.options.value("Window/final_splitter"))
我这样还原它:

self.options.setValue("Window/final_splitter", self.splitter2.saveState())
self.splitter2.restoreState(self.options.value("Window/final_splitter"))
保存拆分器时,splitter2.sizes指示:[321818769]

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

我无法在拆分器上执行更多操作,因为我无法获得正确的大小

你知道如何解决这个错误吗

编辑: 更奇怪的是:

保存:

self.options.setValue("Window/final_splitter", self.splitter2.sizes())
->self.splitter2.size:[321844743]

恢复:

sizes_splitter2 = [int(nbr) for nbr in self.options.value("Window/final_splitter", [])]
self.splitter2.setSizes(sizes_splitter2)
分流器2的尺寸:[321844743] self.splitter2.size:[224590519] 编辑2: 当我保存拆分器时,我也会在QMainWIndow中执行self操作:

self.options.setValue("window_geometry", self.saveGeometry())
self.options.setValue("window_state", self.saveState())
如果我对这些行进行注释,splitter.sizes将返回正确的值。 但是这两条线完成了它们的工作,窗口被恢复到正确的大小

for.restoreState表示您必须将返回的值重新转换为ByteArray QSettings可以返回变量类型,而不是您最初设置的类型

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

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

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

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

希望此演示脚本能够显示正在发生的事情:

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_())

在拆分器上调用.刷新有帮助吗?文档中提到你不需要这样做,但这可能会有所帮助。不,它不会改变什么,对不起。谢谢你的澄清。我注意到321+818+769=1908和224+572+537=1333。如果你做321/1908=0.168和224/1333=0.168。也就是说,第一个区域仍然占据窗口的16.8%,窗口只是更小。是真的吗?是的,我也开始闻到什么了。我在问题中添加了一个编辑。但不,窗户并没有变小。当我关闭和打开程序时,一切都完全相同。我尝试了:self.splitter2.restoreStateself.options.valueWindow/final_splitter.tobyterray,但我有一个异常告诉我它已经是byteArray了。拆分器维度在窗口中以可视方式恢复,但其大小属性似乎设置不正确。是的,我想知道当设置它们时,UI是否正在更新,但不是ByteArray阻止它在内部存储。哦,好吧,回到绘图板。不是真的,我正试图让我的拆分器的大小做一些调整。但实际上,我的拆分器的大小比它们应该的小,但它们显示正常。sizes方法返回错误的结果。此外,MainWindow.geometry返回的宽度小于窗口实际的宽度。@Rififi。我的示例按预期工作。如果您有反例,您需要在问题中显示它。QtCore.QTimer.singleShot0,lambda:print'Timer:',self.splitter.size应该打印拆分器的实际大小?@Rififi。是的,它在Linux上对我有用。使用python 3.4.2、Qt4.8.6、PyQt4.11.3。你的设置是什么?@Rififi。我扩展了我的示例,使用QMainWindow保存/恢复状态/几何体,所有这些都按照我的预期工作。如果您需要更多帮助,您将不得不生成一个重现问题的工作示例。