rss
twitter
  • Мой твиттер

Позиционирование в PyQt4 – программирование PyQt4 часть 3

| Posted in python |

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)

Установили макет основного окна.
Box Layout

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 ()

QGridLayout

Комментарии (1)

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

Добавить комментарий