Полуразмерные виджеты в 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()
Это создает начальный интерфейс, который выглядит следующим образом:
Когда изображение развернуто по горизонтали, вы можете видеть, что левый виджет остается того же размера:
Когда развернуто вертикально, оба виджета раскрываются:
Наконец, размер сплиттера можно изменить:
Если вы отрегулируете размер окна после настройки сплиттера, левый виджет сохранит свой размер, а правый развернется / свернется, чтобы заполнить оставшуюся часть окна.
Сообщение Энди недоступно для редактирования, поэтому я добавляю еще один ответ. Обновлено для 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()