Позиционирование в PyQt4 – программирование PyQt4 часть 3
| Posted in python | Posted on 03-12-2009
1
Важной частью в программировании является управление слоями. Управление слоями можно осуществлять двумя путями: абсолютное позиционирование и объединением классов.
Абсолютное позиционирование
Программист определяет положение и размер каждого виджета в пикселях. При использовании абсолютного позиционирования, вы должны понять несколько вещей:
- Размер и расположение виджетов не изменится, если изменятся размеры окна
- приложения могут выглядеть по-разному на разных платформах
- изменения шрифтов в приложение может испортить макет
#!/usr/bin/python
# absolute.py
import sys
from PyQt4 import QtGui
class Absolute(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('Communication')
label = QtGui.QLabel('Couldn\'t', self)
label.move(15, 10)
label = QtGui.QLabel('care', self)
label.move(35, 40)
label = QtGui.QLabel('less', self)
label.move(55, 65)
label = QtGui.QLabel('And', self)
label.move(115, 65)
label = QtGui.QLabel('then', self)
label.move(135, 45)
label = QtGui.QLabel('you', self)
label.move(115, 25)
label = QtGui.QLabel('kissed', self)
label.move(145, 10)
label = QtGui.QLabel('me', self)
label.move(215, 10)
self.resize(250, 150)
app = QtGui.QApplication(sys.argv)
qb = Absolute()
qb.show()
sys.exit(app.exec_())
В примере система координат находится в левом верхнем углу. Значения X растут слева направо. Значения Y растут с верху вниз.

Box Layout
Поставим две кнопки в правом нижнем углу. Чтобы это сделать мы будем использовать одно горизонтальное и одно вертикальное поле.
#!/usr/bin/python
# boxlayout.py
import sys
from PyQt4 import QtGui
class BoxLayout(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('box layout')
ok = QtGui.QPushButton("OK")
cancel = QtGui.QPushButton("Cancel")
hbox = QtGui.QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(ok)
hbox.addWidget(cancel)
vbox = QtGui.QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
self.setLayout(vbox)
self.resize(300, 150)
app = QtGui.QApplication(sys.argv)
qb = BoxLayout()
qb.show()
sys.exit(app.exec_())
ok = QtGui.QPushButton("OK") cancel = QtGui.QPushButton("Cancel")
Создаем кнопки
hbox = QtGui.QHBoxLayout() hbox.addStretch(1) hbox.addWidget(ok) hbox.addWidget(cancel)
Горизонтальное расположение окна
self.setLayout(vbox)
Установили макет основного окна.

QGridLayout
Универсальный макет в виде таблицы. Делит пространство на строки и столбцы.
#!/usr/bin/python
# gridlayout.py
import sys
from PyQt4 import QtGui
class GridLayout(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('grid layout')
names = ['Cls', 'Bck', '', 'Close', '7', '8', '9', '/',
'4', '5', '6', '*', '1', '2', '3', '-',
'0', '.', '=', '+']
grid = QtGui.QGridLayout()
j = 0
pos = [(0, 0), (0, 1), (0, 2), (0, 3),
(1, 0), (1, 1), (1, 2), (1, 3),
(2, 0), (2, 1), (2, 2), (2, 3),
(3, 0), (3, 1), (3, 2), (3, 3 ),
(4, 0), (4, 1), (4, 2), (4, 3)]
for i in names:
button = QtGui.QPushButton(i)
if j == 2:
grid.addWidget(QtGui.QLabel(''), 0, 2)
else: grid.addWidget(button, pos[j][0], pos[j][1])
j = j + 1
self.setLayout(grid)
app = QtGui.QApplication(sys.argv)
qb = GridLayout()
qb.show()
sys.exit(app.exec_())
В нашем примере мы создали сетку из кнопок.
grid = QtGui.QGridLayout()
Создаем сетку.
if j == 2:
grid.addWidget(QtGui.QLabel(''), 0, 2)
else: grid.addWidget(button, pos[j][0], pos[j][1])
Чтобы добавить компонент к сетке, мы используем addWidget ()



Большое спасибо за статьи. Очень пригодились.