简单来说:QWidget 是 CPU 绘图时代的产物,而 QML(Qt Quick) 是 GPU 绘图时代的产物。所以在动画、透明效果、缩放、旋转、大量元素移动等场景下,QML 往往比 QWidget 流畅得多。1. QWidget 是怎么画出来的?先看 QWidget 的工作方式。例如:QPushButton QLabel QTableView QTreeView这些控件都继承自 QWidget。当窗口需要刷新时:paintEvent()会被调用。例如:void MyWidget::paintEvent(QPaintEvent *) { QPainter p(this); p.drawRect(...); p.drawText(...); p.drawPixmap(...); }流程:CPU ↓ QPainter绘图 ↓ 生成像素 ↓ 写入内存缓冲区 ↓ 提交给窗口系统 ↓ 显示器本质上:QWidget = CPU Raster Paint即:CPU负责画每一个像素2. QWidget 为什么动画容易卡?假设一个按钮从:x=0移动到:x=500动画 60FPS。每一帧:清空背景 ↓ 重新画按钮 ↓ 重新画文字 ↓ 重新画边框 ↓ 重新
QML与QWidget的流畅度
简单来说:QWidget 是 CPU 绘图时代的产物,而 QML(Qt Quick) 是 GPU 绘图时代的产物。所以在动画、透明效果、缩放、旋转、大量元素移动等场景下,QML 往往比 QWidget 流畅得多。1. QWidget 是怎么画出来的?先看 QWidget 的工作方式。例如:QPushButton QLabel QTableView QTreeView这些控件都继承自 QWidget。当窗口需要刷新时:paintEvent()会被调用。例如:void MyWidget::paintEvent(QPaintEvent *) { QPainter p(this); p.drawRect(...); p.drawText(...); p.drawPixmap(...); }流程:CPU ↓ QPainter绘图 ↓ 生成像素 ↓ 写入内存缓冲区 ↓ 提交给窗口系统 ↓ 显示器本质上:QWidget = CPU Raster Paint即:CPU负责画每一个像素2. QWidget 为什么动画容易卡?假设一个按钮从:x=0移动到:x=500动画 60FPS。每一帧:清空背景 ↓ 重新画按钮 ↓ 重新画文字 ↓ 重新画边框 ↓ 重新