QWidget详细解说
QWidget 在 Python(PyQt/PySide) 中的详细解说,涵盖核心方法、属性、使用场景及代码示例:
1. QWidget 基础
QWidget 是 Qt 中所有用户界面控件的基类,用于构建 GUI 应用。在 Python 中,主要通过 PyQt5 或 PySide6 库使用。
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout
# 或 from PySide6.QtWidgets import ...
2. 核心方法与属性
几何属性与布局
| 方法/属性 | 说明 | Python 示例 |
|---|---|---|
geometry() |
获取控件的位置和尺寸(相对于父窗口) | rect = widget.geometry() |
setGeometry(x, y, w, h) |
设置控件的位置和尺寸 | widget.setGeometry(100, 100, 300, 200) |
size() |
获取控件的尺寸 | width, height = widget.size().width(), widget.size().height() |
resize(w, h) |
调整控件尺寸 | widget.resize(400, 300) |
move(x, y) |
移动控件到父窗口的坐标 | widget.move(50, 50) |
adjustSize() |
根据内容自动调整尺寸 | widget.adjustSize() |
窗口与可见性
| 方法/属性 | 说明 | Python 示例 |
|---|---|---|
show() |
显示控件(顶级窗口直接弹出) | widget.show() |
hide() |
隐藏控件 | widget.hide() |
isVisible() |
检查控件是否可见 | if widget.isVisible(): ... |
setWindowTitle(title) |
设置窗口标题 | widget.setWindowTitle("My App") |
setWindowFlag(flag) |
设置窗口标志(如无边框) | widget.setWindowFlag(Qt.FramelessWindowHint) |
事件处理
| 方法 | 说明 | Python 示例 |
|---|---|---|
paintEvent() |
重写绘制事件 | 见下方代码示例 |
mousePressEvent() |
处理鼠标点击事件 | 见下方代码示例 |
keyPressEvent() |
处理键盘事件 | def keyPressEvent(self, event): ... |
焦点与样式
| 方法/属性 | 说明 | Python 示例 |
|---|---|---|
setFocus() |
让控件获取焦点 | widget.setFocus() |
setStyleSheet(style) |
设置 CSS 样式表 | widget.setStyleSheet("background: #f0f0f0;") |
setEnabled(enable) |
启用/禁用控件 | widget.setEnabled(False) |
3. 代码示例
基础窗口
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(100, 100, 400, 300) # (x, y, width, height)
self.setWindowTitle("Hello PyQt")
label = QLabel("Welcome to Qt!", self)
label.move(50, 50)
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
自定义控件(重写 paintEvent)
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import Qt
class CircleWidget(QWidget):
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setBrush(QColor("#FF5733"))
painter.drawEllipse(self.rect()) # 在控件区域内绘制圆形
# 使用
widget = CircleWidget()
widget.resize(200, 200)
widget.show()
事件处理(鼠标点击)
class ClickableWidget(QWidget):
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
print(f"Clicked at ({event.x()}, {event.y()})")
super().mousePressEvent(event) # 调用父类方法
widget = ClickableWidget()
widget.setMouseTracking(True) # 启用鼠标跟踪
布局管理
class LayoutExample(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout()
layout.addWidget(QPushButton("Button 1"))
layout.addWidget(QPushButton("Button 2"))
self.setLayout(layout)
self.show()
4. 关键属性
| 属性 | 类型 | 说明 |
|---|---|---|
windowTitle |
str |
窗口标题(通过 setWindowTitle 设置) |
enabled |
bool |
控件是否启用(setEnabled(True/False)) |
toolTip |
str |
鼠标悬停提示文本(setToolTip("text")) |
sizePolicy |
QSizePolicy |
控件在布局中的缩放策略(如 setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) |
5. 高级用法
动态样式表
widget.setStyleSheet("""
QWidget {
background: #2c3e50;
color: white;
border-radius: 10px;
}
QPushButton {
background: #3498db;
padding: 5px 10px;
}
""")
信号与槽
button = QPushButton("Click Me", widget)
button.clicked.connect(self.on_button_clicked) # 绑定点击事件
def on_button_clicked(self):
print("Button clicked!")
窗口标志与属性
# 设置无边框和透明背景
self.setWindowFlag(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
6. 注意事项
-
内存管理:
Python 的垃圾回收会自动处理控件,但建议通过父子关系管理对象:button = QPushButton("OK", parent_widget) # 父控件销毁时自动删除子控件 -
线程安全:
GUI 操作必须在主线程执行,否则会崩溃。耗时任务需使用QThread或QTimer。 -
事件循环:
避免在事件处理函数中执行阻塞操作(如time.sleep),改用异步或定时器。
总结
QWidget 是 Qt GUI 开发的核心,通过 Python 的 PyQt/PySide 可以快速构建跨平台应用。重点掌握:
- 几何属性与布局管理
- 事件处理机制(重写
paintEvent、mousePressEvent等) - 样式表与信号槽机制
- Python 特有的父子对象内存管理
浙公网安备 33010602011771号