QWidget: The base class of all user interface objects. It provides the basic functionality for all widgets in Qt.
QWidget
is the base class for all user interface objects in PySide6. It provides the fundamental functionalities needed for all GUI elements. While QWidget
itself is an abstract base class and is not typically instantiated directly, it serves as the foundation for more specialized widgets like QPushButton
, QLabel
, QLineEdit
, and more.
Key Features of QWidget
- Basic Functionality: Provides basic window functionality, such as resizing, moving, and event handling.
- Parent-Child Hierarchy: Supports a hierarchical relationship where widgets can be parents or children of other widgets.
- Custom Painting: Allows custom painting by overriding the
paintEvent
method. - Event Handling: Handles a wide range of events, including mouse, keyboard, and focus events.
- Layouts: Supports layout management to arrange child widgets.
Creating a Basic QWidget
Although QWidget
is typically used as a base class, you can create a simple QWidget
and add other widgets to it. Here's an example:
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QMainWindow
class BasicWidget(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout()
self.label = QLabel("Hello, QWidget!")
self.button = QPushButton("Click Me")
self.button.clicked.connect(self.on_button_clicked)
layout.addWidget(self.label)
layout.addWidget(self.button)
self.setLayout(layout)
self.setWindowTitle('QWidget Example')
def on_button_clicked(self):
self.label.setText("Button Clicked!")
app = QApplication([])
window = BasicWidget()
window.show()
app.exec()
In this example, we create a basic QWidget
with a QVBoxLayout
containing a QLabel
and a QPushButton
. When the button is clicked, the label's text changes.
Customizing Appearance with Stylesheets
You can customize the appearance of a QWidget
and its child widgets using stylesheets (CSS):
self.setStyleSheet("""
QWidget {
background-color: #f0f0f0;
}
QLabel {
color: #3498db;
font-size: 18px;
}
QPushButton {
background-color: #3498db;
color: white;
border-radius: 5px;
padding: 10px;
}
QPushButton:hover {
background-color: #2980b9;
}
""")
Handling Events
QWidget
provides a comprehensive event handling system. You can override event handlers to customize the behavior of your widget. For example, to handle mouse events:
from PySide6.QtCore import Qt
class EventHandlingWidget(QWidget):
def __init__(self):
super().__init__()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
print("Left mouse button pressed")
def keyPressEvent(self, event):
if event.key() == Qt.Key_Escape:
print("Escape key pressed")
Custom Painting
For custom drawing, you can override the paintEvent
method and use a QPainter
object:
from PySide6.QtGui import QPainter, QColor
class CustomPaintWidget(QWidget):
def __init__(self):
super().__init__()
self.setFixedSize(200, 200)
def paintEvent(self, event):
painter = QPainter(self)
painter.setBrush(QColor(100, 100, 255))
painter.drawRect(50, 50, 100, 100)
Practical Example
Let's create a practical example that demonstrates custom painting and event handling within a QWidget
:
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton
from PySide6.QtGui import QPainter, QColor
from PySide6.QtCore import Qt
class AdvancedWidget(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
layout = QVBoxLayout()
self.label = QLabel("Click the button or press any key")
self.button = QPushButton("Click Me")
self.button.clicked.connect(self.on_button_clicked)
layout.addWidget(self.label)
layout.addWidget(self.button)
self.setLayout(layout)
self.setWindowTitle('Advanced QWidget Example')
self.setFixedSize(300, 200)
def on_button_clicked(self):
self.label.setText("Button Clicked!")
self.update()
def keyPressEvent(self, event):
self.label.setText(f"Key Pressed: {event.text()}")
self.update()
def paintEvent(self, event):
painter = QPainter(self)
painter.setBrush(QColor(100, 100, 255))
painter.drawRect(10, 10, 280, 180)
app = QApplication([])
window = AdvancedWidget()
window.show()
app.exec()
In this example, we create an advanced QWidget
that includes custom painting and handles button clicks and key presses.