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)
