QSplitter.尺寸表示尺寸错误

2024-06-02 14:32:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我保存了一个QSplitter的状态:

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

我就这样恢复了:

^{pr2}$

保存拆分器时,splitter2.size()指示:[321818769]

当我恢复拆分器时,它的尺寸与关闭它时的尺寸相同,但splitter2.size()表示:[224572537]

我不能对拆分器执行更多操作,因为我无法正确调整它的大小。在

你有什么办法解决这个问题吗?在

编辑: 更奇怪的是:

保存:

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

->;自拆分器2.size():[321844743]

正在恢复:

sizes_splitter2 = [int(nbr) for nbr in self.options.value("Window/final_splitter", [])]
self.splitter2.setSizes(sizes_splitter2)
  • 2号分离器尺寸:[321844743]
  • 在自拆分器2.size():[224590519]

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

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

如果我评论这些台词分离器尺寸()返回正确值。 但这两条线做了他们的工作,窗户被恢复到正确的大小!在


Tags: self编辑size尺寸windowfinaloptionssizes
2条回答

.restoreState()documentation表示必须将返回值重新转换为ByteArrayQSettings可以返回{}类型,与最初设置的类型不同)。在

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

值得注意的是,QSettings的行为在不同版本的PyQt/PySide和不同的平台上有所不同,但是上面的内容在所有情况下都应该有效。在

我猜你是想在窗口完全显示之前查询拆分器的大小。在

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

希望这个演示脚本可以显示出发生了什么:

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

相关问题 更多 >