QPainter(Qt中的画家):能够绘制各种图形,拥有绘图所需的画笔(QPen),画刷(QBrush),字体(QFont)
QPaintDevice(Qt中的画布):QPainter的绘图板,所有的QWidget类都继承自QPaintDevice
重要规则:
只能在QWidget::paintEvent中绘制图形
void paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.drawLine(QPoint(30,30),QPoint(100,100));
}
动态绘制图形
- 根据需要确定参数对象(绘图类型,点坐标,角度等)
- 将参数对象存入数据集合中(如:链表)
- 在paintEvent函数中遍历数据集合
根据参数对象绘制图形(update())
QPainter使用逻辑坐标系绘制图形
- 逻辑坐标系中图形的大小和位置经由转换后绘制与具体设备
- 默认情况下的逻辑坐标系与物理坐标系完全一致
视口:物理坐标系中一个任意指定的矩形
窗口:逻辑坐标系下对应到物理坐标系中的相同矩形
正弦波形绘图实例
- 定义视口矩形和逻辑坐标系
- 定义画笔并填充窗口底色
- 根据实际问题中的波形函数绘图(drawPoint())
QPainter使用逻辑坐标系进行绘图
逻辑坐标系能够变换到物理坐标系
视口与窗口指不同坐标系下的同一个矩形
窗口用于逻辑坐标系下的图形绘制
视口用于实际物理设备上的图形显示
自由绘图解决方案
- 以鼠标按下为开始,记录开始坐标
- mousePressEvent
- 记录鼠标移动时经过的像素坐标
- mouseMoveEvent
- 以鼠标释放为结束,记录结束坐标
- mouseReleaseEvent
- 按照记录顺序在两两坐标之间绘制直线
- paintEvent
如何实现基础图形动态绘制
分析:基础图形的目标是固定的,但是开始点与结束点的不同会导致最终形状的差异;因此,鼠标移动时根据当前坐标实时绘图,鼠标松开时确定最终图形
基本图形绘制需要在鼠标按下并移动时进行动态绘图,但是,无论何时都只需要记录两个坐标值
基础图形绘制解决方案
- 以鼠标按下为开始,记录开始坐标
- mousePressEvent
- 记录鼠标移动时经过的每个坐标作为临时结束坐标
- mouseMoveEvent
- 以鼠标释放为结束,记录最终结束坐标
- mouseReleaseEvent
- 在开始坐标和结束坐标之间绘制目标图形
- paintEvent