Python

Resizable split windows with QSplitter (PySide)

Let the user drag a handle to resize panes — QSplitter does it with almost no code.

sf
Naoki « segfault »
systèmes & back-end · updated Jan 2025
This guide revisits and updates an original tutorial from noiretaya.com (log.noiretaya.com/256). The code has been refreshed for current versions.

The idea

QSplitter arranges child widgets in a row or column with draggable handles between them. Add your widgets, set an orientation, and the user can resize each pane.

from PySide6.QtWidgets import QApplication, QSplitter, QTextEdit
from PySide6.QtCore import Qt
import sys

app = QApplication(sys.argv)
splitter = QSplitter(Qt.Horizontal)
splitter.addWidget(QTextEdit("Left pane"))
splitter.addWidget(QTextEdit("Right pane"))
splitter.setSizes([200, 400])   # initial proportions
splitter.resize(640, 400)
splitter.show()
sys.exit(app.exec())

Nesting splitters

Put a vertical splitter inside a horizontal one to build IDE-style layouts (sidebar + editor + console).

outer = QSplitter(Qt.Horizontal)
inner = QSplitter(Qt.Vertical)
inner.addWidget(editor); inner.addWidget(console)
outer.addWidget(sidebar); outer.addWidget(inner)
Tip: setStretchFactor(index, factor) controls which pane grows when the window is resized.