Полуразмерные виджеты в PyQt

Я пытаюсь создать gui с двумя основными widgets, Окно должно быть изменяемого размера. При горизонтальном изменении размера только один из них должен расширяться. При изменении размера по вертикали оба должны расширяться. Кроме того, должна быть возможность перенастроить размер этого разделения по горизонтали. Я проиллюстрировал это, чтобы сделать это более понятным:

Изменить размер поведения

С tkinter это было легко достижимо со свойствами expand а также fill, В Qt Я мог бы использовать resize event но я надеюсь, что мне не придется делать это вручную, поскольку это должно быть обычной задачей. Я пытался играть с QHBoxLayout но безуспешно, к сожалению.

Любая помощь с благодарностью. Благодарю.

2 ответа

Решение

Вам нужно использовать setStretchFactor метод на вашем QSplitter,

Пример (модифицированный из примера QSplitter здесь):

import sys
from PyQt4 import QtGui, QtCore

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):     
        hbox = QtGui.QHBoxLayout(self)
        left = QtGui.QFrame(self)       
        left.setFrameShape(QtGui.QFrame.StyledPanel)
        right = QtGui.QFrame(self)
        right.setFrameShape(QtGui.QFrame.StyledPanel)
        splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        splitter.addWidget(left)
        splitter.addWidget(right)
        splitter.setStretchFactor(1, 1)
        splitter.setSizes([125, 150])
        hbox.addWidget(splitter)
        self.setLayout(hbox)
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('QtGui.QSplitter')
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()  

Это создает начальный интерфейс, который выглядит следующим образом:

Начальный интерфейс

Когда изображение развернуто по горизонтали, вы можете видеть, что левый виджет остается того же размера:

Расширены по горизонтали

Когда развернуто вертикально, оба виджета раскрываются:

введите описание изображения здесь

Наконец, размер сплиттера можно изменить:

Resizeable

Если вы отрегулируете размер окна после настройки сплиттера, левый виджет сохранит свой размер, а правый развернется / свернется, чтобы заполнить оставшуюся часть окна.

Сообщение Энди недоступно для редактирования, поэтому я добавляю еще один ответ. Обновлено для PyQt5/PyQt6.

      import sys
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QWidget, QHBoxLayout, QFrame, QSplitter, QApplication, QStyleFactory

class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)
        left = QFrame(self)
        left.setFrameShape(QFrame.Shape.StyledPanel)
        right = QFrame(self)
        right.setFrameShape(QFrame.Shape.StyledPanel)
        splitter = QSplitter(Qt.Orientation.Horizontal)
        splitter.addWidget(left)
        splitter.addWidget(right)
        splitter.setStretchFactor(1, 1)
        splitter.setSizes([125, 150])
        hbox.addWidget(splitter)
        self.setLayout(hbox)
        QApplication.setStyle(QStyleFactory.create('Cleanlooks'))
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('QtGui.QSplitter')
        self.show()

def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()  

Другие вопросы по тегам