Менеджеры компоновки в PyQt на Python

Пример сочетания в одном окне разных способов компоновки

from PyQt4 import QtGui, QtCore
import sys
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
window.resize(350,200)
 
button1 = QtGui.QPushButton("1")
button2 = QtGui.QPushButton("2")
 
hbox = QtGui.QHBoxLayout() # горизонтальный упаковщик
hbox.addWidget(button1,1,QtCore.Qt.AlignRight)
hbox.addWidget(button2,3,QtCore.Qt.AlignTop|QtCore.Qt.AlignLeft)
hbox.insertSpacing(1,100)
 
button3 = QtGui.QPushButton("3")
button4 = QtGui.QPushButton("4")
button5 = QtGui.QPushButton("5")
button6 = QtGui.QPushButton("6")
 
gbox = QtGui.QGridLayout() # сетка
gbox.addWidget(button3,0,0) # добавление компонентов
gbox.addWidget(button4,0,1)
gbox.addWidget(button5,1,0,QtCore.Qt.AlignRight)
gbox.addWidget(button6,1,1,QtCore.Qt.AlignLeft)
 
gbox.addLayout(hbox,2,0,1,2) # добавление упаковщика в сетку
# 3-е и 4-е числа - кол-во объединенных строк и столбцов
 
window.setLayout(gbox) # на окно ставится только сетка
 
window.show()
sys.exit(app.exec_())

Использование QFormLayout

QFormLayout — это контейнер, состоящий из двух столбцов.
В каждую ячейку столбца можно добавлять компонент или контейнер.
Если добавляется только один объект, то он занимает два столбца.
Удобно использовать, когда надо подписывать компоненты (например, поля). В этом случае надпись в одном столбце соотносится с полем в другом.

from PyQt4 import QtGui, QtCore
import sys
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
 
line = QtGui.QLineEdit()
text = QtGui.QTextEdit()
form = QtGui.QFormLayout()
form.addRow("&Название:",line)
form.addRow("&Описание:",text)
 
button1 = QtGui.QPushButton("О&тправить")
button2 = QtGui.QPushButton("О&чистить")
 
hbox = QtGui.QHBoxLayout()
hbox.addWidget(button1)
hbox.addWidget(button2)
 
form.addRow(hbox)
 
window.setLayout(form)
 
window.show()
sys.exit(app.exec_())

Упаковка группы

Достаточно сложно. Иначе не работает.

from PyQt4 import QtGui, QtCore
import sys
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
 
radio1 = QtGui.QRadioButton("&Yes")
radio2 = QtGui.QRadioButton("&No")
 
hbox = QtGui.QHBoxLayout() # кнопки на упаковщик1
hbox.addWidget(radio1)
hbox.addWidget(radio2)
 
box = QtGui.QGroupBox("&Hello")
box.setLayout(hbox) # упаковщик1 на группу
 
vbox = QtGui.QVBoxLayout()
vbox.addWidget(box) # группу на упаковщик2
 
window.setLayout(vbox) # упаковщик2 на окно
 
window.show()
sys.exit(app.exec_())

Добавление рамки вокруг группы компонентов

from PyQt4 import QtGui, QtCore
import sys
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
 
field = QtGui.QLineEdit("Hello")
button1 = QtGui.QPushButton("Del")
 
box = QtGui.QVBoxLayout() # элементы на компоновщик1
box.addWidget(field)
box.addWidget(button1,1,QtCore.Qt.AlignRight)
 
frame = QtGui.QFrame()
frame.setFrameShape(QtGui.QFrame.Panel)
frame.setFrameShadow(QtGui.QFrame.Sunken)
frame.setLayout(box) # компоновщик1 на рамку
 
button2 = QtGui.QPushButton("OK")
 
vbox = QtGui.QVBoxLayout() # рамку на компоновщик2
vbox.addWidget(frame)
vbox.addWidget(button2)
 
window.setLayout(vbox) # компоновщик2 на окно
window.show()
sys.exit(app.exec_())

Окно с вкладками

На вкладку можно добавить только компонент, но не компоновщик. Поэтому компоненты группируются в QFrame или QGroupBox.

from PyQt4 import QtGui, QtCore
import sys
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
 
field = QtGui.QLineEdit("Hello")
button1 = QtGui.QPushButton("Del")
 
box = QtGui.QVBoxLayout()
box.addWidget(field)
box.addWidget(button1,1,QtCore.Qt.AlignRight)
 
frame = QtGui.QFrame()
frame.setLayout(box)
 
button2 = QtGui.QPushButton("OK")
box2 = QtGui.QVBoxLayout()
box2.addWidget(button2,)
group = QtGui.QGroupBox()
group.setLayout(box2)
 
tab = QtGui.QTabWidget()
tab.addTab(frame,"&1") # вкладки
tab.addTab(group,"&2")
 
vbox = QtGui.QVBoxLayout()
vbox.addWidget(tab)
 
window.setLayout(vbox)
window.show()
sys.exit(app.exec_())

Вкладки могут быть расположены по вертикали:

...
tab = QtGui.QToolBox()
tab.addItem(frame,"&1") # вкладки
tab.addItem(group,"&2")
...

Растягивающиеся компоненты

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

from PyQt4 import QtGui, QtCore
import sys
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
 
label1 = QtGui.QLabel('One')
label2 = QtGui.QLabel('Two')
label1.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain)
label2.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain)
 
splitter = QtGui.QSplitter(QtCore.Qt.Vertical)
splitter.addWidget(label1)
splitter.addWidget(label2)
 
vbox = QtGui.QVBoxLayout()
vbox.addWidget(splitter)
 
window.setLayout(vbox)
window.show()
sys.exit(app.exec_())

  Python Tkinter Textbox: Creating and Managing Text Fields
Оцените статью
( Пока оценок нет )
Поделиться с друзьями
Python для начинающих
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x