PyQt QWidget в Python — хранение и размещение виджетов
QWidget — это базовый класс всех остальных виджетов.
Знакомство с PyQt QWidget
QWidget — это пустая область для хранения других виджетов. Поэтому он может быть использован как контейнер для организации дочерних виджетов в Python.
QWidget похож на Frame в Tkinter для размещения других виджетов.
Ниже показано, как создать объект QWidget внутри главного окна или родительского виджета:
widget = QWidget(parent)
Родителmcrbv может быть объект главного окна или родительский объект виджета, к которому принадлежит объект QWidget.
Предоставление родительского виджета в качестве аргумента QWidget гарантирует, что дочерние виджеты будут удалены сборщиком мусора одновременно с родительским виджетом, и ограничивает его видимость только родительским виджетом.
Пример с PyQt QWidget
Следующая программа показывает, как использовать QWidget в качестве контейнера других виджетов:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QLineEdit, QFormLayout, QHBoxLayout class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt Widget Demo') # create an input pane layout = QHBoxLayout() self.setLayout(layout) # person pane person_pane = QWidget(self) form_layout = QFormLayout() person_pane.setLayout(form_layout) form_layout.addRow('First Name:', QLineEdit(person_pane)) form_layout.addRow('Last Name:', QLineEdit(person_pane)) form_layout.addRow('Date of Birth:', QLineEdit(person_pane)) form_layout.addRow('Email Address:', QLineEdit(person_pane)) form_layout.addRow('Phone Number:', QLineEdit(person_pane)) layout.addWidget(person_pane) # address pane address_pane = QWidget(self) form_layout = QFormLayout() address_pane.setLayout(form_layout) form_layout.addRow('Street:', QLineEdit(address_pane)) form_layout.addRow('City:', QLineEdit(address_pane)) form_layout.addRow('State/Province:', QLineEdit(address_pane)) form_layout.addRow('Zip Code:', QLineEdit(address_pane)) form_layout.addRow('Country:', QLineEdit(address_pane)) layout.addWidget(address_pane) # show the window self.show() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Как это работает.
- Сначала установите макет главного окна как QHBoxLayout:
layout = QHBoxLayout() self.setLayout(layout)
- Во-вторых, создайте виджет как контейнер(person_pane), который использует макет формы и добавляет другие виджеты в контейнер:
person_pane = QWidget(self) form_layout = QFormLayout() person_pane.setLayout(form_layout) form_layout.addRow('First Name:', QLineEdit(person_pane)) form_layout.addRow('Last Name:', QLineEdit(person_pane)) form_layout.addRow('Date of Birth:', QLineEdit(person_pane)) form_layout.addRow('Email Address:', QLineEdit(person_pane)) form_layout.addRow('Phone Number:', QLineEdit(person_pane))
- В-третьих, создайте еще один виджет в качестве контейнера(address_pane), который также использует макет формы и добавляет другие виджеты в контейнер:
address_pane = QWidget(self) form_layout = QFormLayout() address_pane.setLayout(form_layout) form_layout.addRow('Street:', QLineEdit(address_pane)) form_layout.addRow('City:', QLineEdit(address_pane)) form_layout.addRow('State/Province:', QLineEdit(address_pane)) form_layout.addRow('Zip Code:', QLineEdit(address_pane)) form_layout.addRow('Country:', QLineEdit(address_pane))
- Наконец, добавьте виджет в главное окно:
layout.addWidget(person_pane) layout.addWidget(address_pane)