QWidget 是 PyQt5 中所有用户界面组件的基础类,它是所有窗口和控件的基类(如按钮、标签、输入框等)。QWidget 提供了构建 GUI 程序的核心功能,包括窗口渲染、事件处理、布局管理和样式设置。以下是详细说明:
一、核心功能
- 窗口管理:创建独立窗口或嵌套在其他窗口内的组件。
- 事件处理:响应鼠标、键盘、焦点等用户交互事件。
- 布局控制:通过布局类(如
QHBoxLayout、QVBoxLayout)管理子控件的位置和大小。 - 样式定制:支持 CSS 样式表、自定义绘制和字体/颜色设置。
- 父子关系:通过层级结构管理控件的生命周期(父控件销毁时自动销毁子控件)。
二、常用方法
1. 窗口属性设置
| 方法 | 说明 | 示例 |
|---|---|---|
setWindowTitle(title: str) | 设置窗口标题 | widget.setWindowTitle("我的窗口") |
setGeometry(x: int, y: int, w: int, h: int) | 设置窗口位置和尺寸 | widget.setGeometry(100, 100, 400, 300) |
resize(width: int, height: int) | 调整窗口大小 | widget.resize(800, 600) |
show() | 显示窗口 | widget.show() |
hide() | 隐藏窗口 | widget.hide() |
close() | 关闭窗口 | widget.close() |
2. 父子关系管理
| 方法 | 说明 |
|---|---|
setParent(parent: QWidget) | 设置父控件(影响生命周期和坐标系统) |
parentWidget() | 获取父控件 |
children() | 获取所有子控件列表 |
3. 样式与外观
| 方法 | 说明 | 示例 |
|---|---|---|
setStyleSheet(style: str) | 应用 CSS 样式表 | widget.setStyleSheet("background: #F0F0F0;") |
setFont(font: QFont) | 设置字体 | widget.setFont(QFont("Arial", 12)) |
setPalette(palette: QPalette) | 设置调色板(颜色方案) | 见下方示例 |
4. 事件处理
通过重写事件方法实现交互逻辑:
| 事件方法 | 说明 |
|---|---|
mousePressEvent(event: QMouseEvent) | 鼠标点击事件 |
keyPressEvent(event: QKeyEvent) | 键盘按键事件 |
paintEvent(event: QPaintEvent) | 窗口绘制事件(用于自定义绘图) |
resizeEvent(event: QResizeEvent) | 窗口大小调整事件 |
5. 布局管理
| 方法 | 说明 |
|---|---|
setLayout(layout: QLayout) | 设置布局管理器(如 QVBoxLayout) |
layout() | 获取当前布局 |
三、示例代码
基础窗口
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设置窗口属性
self.setWindowTitle("示例窗口")
self.resize(400, 300)
# 创建子控件
label = QLabel("Hello, PyQt5!")
button = QPushButton("点击我")
# 设置布局
layout = QVBoxLayout()
layout.addWidget(label)
layout.addWidget(button)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyWidget()
window.show()
sys.exit(app.exec_())
自定义样式
python
# 设置背景色和字体
self.setStyleSheet("""
QWidget {
background-color: #2E2E2E;
color: white;
font-size: 16px;
}
QPushButton {
background: #007ACC;
border-radius: 5px;
padding: 10px;
}
""")
事件处理示例
python
class CustomWidget(QWidget):
def mousePressEvent(self, event):
print(f"鼠标点击位置:({event.x()}, {event.y()})")
def keyPressEvent(self, event):
if event.key() == Qt.Key_Escape:
self.close()
四、与 QMainWindow 的区别
| QWidget | QMainWindow |
|---|---|
| 基础窗口类,无预设结构 | 预设菜单栏、工具栏、状态栏等结构 |
| 适合自定义简单窗口或控件 | 适合复杂主窗口程序 |
| 需要手动添加布局和子控件 | 内置中央部件和停靠窗口管理 |
五、注意事项
-
父子关系:
子控件的坐标相对于父控件。父控件销毁时,子控件自动销毁。 -
内存管理:
PyQt5 使用对象树管理控件生命周期,避免手动delete。 -
事件传播:
若未处理事件(如不调用父类方法),事件可能向上层传播。 -
性能优化:
避免在paintEvent中执行耗时操作,可能导致界面卡顿。
六、总结
- 核心定位:所有 GUI 控件的基类,提供基础渲染和事件处理。
- 适用场景:创建自定义窗口、对话框、嵌套控件或独立组件。
- 扩展方式:通过继承和重写事件方法实现复杂交互逻辑。
1073

被折叠的 条评论
为什么被折叠?



