PyQt QHBoxLayout

Resumo : neste tutorial, você aprenderá como usar o PyQt QHBoxLayoutpara organizar widgets horizontalmente.

O layout PyQt define a maneira de organizar widgets filhos em um widget pai. PyQt oferece suporte a uma variedade de classes de layout, cada uma com uma estratégia de layout adequada a uma situação específica.

As etapas para usar uma classe de layout são as seguintes:

  • Primeiro, crie um objeto de layout a partir de uma classe de layout.
  • Segundo, atribua o objeto de layout à propriedade de layout do widget pai usando o setLayout()método.
  • Terceiro, adicione widgets ao layout usando o addWidget()método do objeto de layout.

Além disso, você pode adicionar layouts a um layout usando o addLayout()método. Isso permite criar um layout mais complexo para organizar widgets.

Introdução ao PyQt QHBoxLayout

Divide QHBoxLayouto widget pai em caixas horizontais e coloca os widgets filhos sequencialmente da esquerda para a direita.

O programa a seguir mostra como usar o QHBoxLayout:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())Linguagem de código:  Python  ( python )

Saída:

PyQt QHBoxLayout

Como funciona.

Primeiro, crie um QHBoxLayoutobjeto:

layout = QHBoxLayout()Linguagem de código:  Python  ( python )

Segundo, defina o layout MainWindowchamando seu setLayout()método:

self.setLayout(layout)Linguagem de código:  Python  ( python )

Terceiro, crie três botões usando QPushButtone adicione-os ao layout usando o addWidget()método:

titles = ['Yes', 'No', 'Cancel']
buttons = [QPushButton(title) for title in titles]
for button in buttons:
    layout.addWidget(button)Linguagem de código:  Python  ( python )

Observe que usamos uma compreensão de lista para criar três botões com base na lista de títulos.

Alinhamentos

Quando o widget pai tiver mais espaço para widgets filhos, os widgets filhos serão estendidos horizontalmente assim:

PyQt QHBoxLayout - Botões esticam horizontalmente

Para manter os widgets filhos em seus tamanhos padrão e alinhá-los horizontalmente, use um espaçador horizontal.

Alinhar à esquerda

Para alinhar o botão à esquerda do widget pai, adicione um espaçador horizontal após os widgets filhos ao QHBoxLayout. Por exemplo:

PyQt QHBoxLayout - Alinhar à esquerda usando um espaçador horizontal

Neste exemplo, o espaçador horizontal se estendeu até o final do layout e deixou espaço suficiente para os botões.

Para adicionar um espaçador horizontal ao final do layout, chame o addStretch()método após adicionar todos os botões ao layout:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # add a spacer
        layout.addStretch()

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Linguagem de código:  Python  ( python )

Alinhar à direita

Da mesma forma, você pode adicionar um espaçador no início do layout para empurrar os botões para a direita:

PyQt QHBoxLayout - Alinhe à direita usando um espaçador horizontal

Para fazer isso, você chama o addStretch()método antes de adicionar botões ao layout:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # add a spacer
        layout.addStretch()

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Linguagem de código:  Python  ( python )

Alinhar centro

Para alinhar os botões ao centro, adicione um espaçador horizontal no início e outro no final do layout:

Para fazer isso você chama addStretch()o método antes e depois de adicionar botões ao layout:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # add a spacer
        layout.addStretch()

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # add a spacer
        layout.addStretch()

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())
Linguagem de código:  Python  ( python )

Colocando um espaçador horizontal entre widgets

É possível colocar o espaçador horizontal entre os widgets para empurrá-los para a esquerda e para a direita do layout:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]

        # add the buttons
        layout.addWidget(buttons[0])
        layout.addWidget(buttons[1])
        
        # add a spacer
        layout.addStretch()

        # add the cancel button
        layout.addWidget(buttons[2])

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Linguagem de código:  Python  ( python )

Configurando fatores de extensão de layout

Por padrão, um widget filho assume seu tamanho padrão. Para definir o espaço que o widget filho pode estender, você chama o método setStretchFactor() do objeto QHBoxLayout:

setStretchFactor(widget, factor)

Por exemplo, podemos fazer com que os botões Sim e Não tenham o mesmo tamanho e ocupem o dobro de espaço que o botão Cancelar usando os fatores de expansão:

PyQt QHBoxLayout - Fatores de extensão de layout
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        # set the stretch factors
        layout.setStretchFactor(buttons[0], 2)
        layout.setStretchFactor(buttons[1], 2)
        layout.setStretchFactor(buttons[2], 1)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())
Linguagem de código:  Python  ( python )

Configurando espaços entre widgets

Por padrão, QHBoxLayoutdefine um espaço padrão entre os widgets filhos. Para alterar os espaços entre eles, você usa o  setSpacing() método do QHBoxLayoutobjeto.

O exemplo a seguir usa o  setSpacing() método para definir os espaços entre os botões como 50px:

PyQt QHBoxLayout - Espaçamento
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        layout.setSpacing(50)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())
Linguagem de código:  Python  ( python )

Definir margens de conteúdo

Por padrão,  QHBoxLayout define margens esquerda, superior, direita e inferior específicas para widgets filhos. Para alterar as margens, você usa o  setContentsMargins() método:

PyQt QHBoxLayout - Exemplo de configuração de margens de conteúdo
setContentsMargins(self, left: int, top: int, right: int, bottom: int) -> NoneLinguagem de código:  PHP  ( php )

O exemplo a seguir usa setContentsMargins()para definir as margens esquerda, superior, direita e inferior dos widgets filhos:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('PyQt QHBoxLayout')

        # create a layout
        layout = QHBoxLayout()
        self.setLayout(layout)

        # create buttons and add them to the layout
        titles = ['Yes', 'No', 'Cancel']
        buttons = [QPushButton(title) for title in titles]
        for button in buttons:
            layout.addWidget(button)

        layout.setContentsMargins(50, 50, 50, 50)

        # show the window
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())
Linguagem de código:  Python  ( python )

Resumo

  • Use QHBoxLayoutpara dividir o widget pai em caixas horizontais e posicioná-las sequencialmente da esquerda para a direita.
  • Use o addStretch()método do QHBoxLayoutobjeto para adicionar um espaçador horizontal ao layout para alinhar os widgets filhos à esquerda, à direita ou ao centro.
  • Use o setStretchFactor()método do QHBoxLayoutobjeto para definir o fator de expansão para um widget filho.
  • Use o setSpacing()método do QHBoxLayoutobjeto para definir os espaços entre os widgets filhos.
  • Use o setContentsMargins()método do QHBoxLayoutobjeto para definir as margens esquerda, superior, direita e inferior.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *