QWidget 深入详解

目录 1. 什么是 QWidget 2. QWidget 的继承体系 3. 创建与基本使用 4. 窗口属性 5. 几何布局与坐标系统 6. 事件系统 7. 绘制系统 8. 样式表 (QSS) 9. 布局管理 10. 子控件与层级管理 11. 自定义控件实战 12. 性能优化 13. 常见陷阱与最佳实践 14. 总结 1. 什么是 QWidget QWidget 是 Qt 框架中所有用户界面对象的基类。它既是"控件"(widget),也是"窗口"(window)。在 Qt 的世界里,几乎所有可见元素都是 QWidget——按钮、标签、输入框、对话框,乃至整个应用程序的主窗口。 核心要点:QWidget 是一个"空白的矩形区域",它知道如何绘制自己、如何处理鼠标键盘事件、如何管理子控件。你可以在它之上构建任意复杂的 UI。 核心职责 职责 说明 窗口管理 最小化、最大化、关闭、标题栏 绘制 通过 paintEvent 自绘外观 事件处理 鼠标、键盘、触控、拖放等 子控件管理 添加、删除、查找子控件 布局管理 与 QLayout 协作自动排列子控件 样式设置 通过 QSS 或 QPalette 定制外观 2. QWidget 的继承体系 QObject └── QPaintDevice └── QWidget ← 本文主角 ├── QFrame │ ├── QLabel │ ├── QAbstractScrollArea │ └── ... ├── QAbstractButton │ ├── QPushButton │ ├── QCheckBox │ ├── QRadioButton │ └── ... ├── QComboBox ├── QLineEdit ├── QSlider ├── QSpinBox ├── QDialog ├── QMainWindow └── ... QObject:提供了信号槽机制、对象树管理、事件过滤器等基础设施。 QPaintDevice:声明了"可以被绘制"的能力,提供了绘制设备的抽象接口。 QWidget:将两者结合,成为一个可交互、可绘制、可包含子对象的矩形区域。 3. 创建与基本使用 3.1 最简单的 QWidget #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget w; w.setWindowTitle("Hello QWidget"); w.resize(400, 300); w.show(); return app.exec(); } 3.2 创建自定义 QWidget 子类 // MyWidget.h #pragma once #include <QWidget> #include <QPainter> class MyWidget : public QWidget { Q_OBJECT // 启用信号槽、元对象特性 public: explicit MyWidget(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *event) override; void mousePressEvent(QMouseEvent *event) override; }; // MyWidget.cpp #include "MyWidget.h" #include <QPainter> MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { setMinimumSize(200, 150); } void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setBrush(QColor(100, 150, 255)); painter.drawRoundedRect(rect().adjusted(5, 5, -5, -5), 10, 10); } void MyWidget::mousePressEvent(QMouseEvent *event) { // 点击时改变颜色 Q_UNUSED(event); update(); } 3.3 对象树与父子关系 QWidget 的构造函数接受一个 parent 参数: ...

2026 年 10 月 13 日