Resumo : neste tutorial, você aprenderá como usar o PyQt QHBoxLayout
para 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 QHBoxLayout
o 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:
Como funciona.
Primeiro, crie um QHBoxLayout
objeto:
layout = QHBoxLayout()
Linguagem de código: Python ( python )
Segundo, defina o layout MainWindow
chamando seu setLayout()
método:
self.setLayout(layout)
Linguagem de código: Python ( python )
Terceiro, crie três botões usando QPushButton
e 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:
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:
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:
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:
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, QHBoxLayout
define um espaço padrão entre os widgets filhos. Para alterar os espaços entre eles, você usa o setSpacing()
método do QHBoxLayout
objeto.
O exemplo a seguir usa o setSpacing()
método para definir os espaços entre os botões como 50px:
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:
setContentsMargins(self, left: int, top: int, right: int, bottom: int) -> None
Linguagem 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
QHBoxLayout
para dividir o widget pai em caixas horizontais e posicioná-las sequencialmente da esquerda para a direita. - Use o
addStretch()
método doQHBoxLayout
objeto para adicionar um espaçador horizontal ao layout para alinhar os widgets filhos à esquerda, à direita ou ao centro. - Use o
setStretchFactor()
método doQHBoxLayout
objeto para definir o fator de expansão para um widget filho. - Use o
setSpacing()
método doQHBoxLayout
objeto para definir os espaços entre os widgets filhos. - Use o
setContentsMargins()
método doQHBoxLayout
objeto para definir as margens esquerda, superior, direita e inferior.