一、原理与设计
所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件上。在早期的 Qt 版本中,若直接在控件上进行绘制工作,则在控件重绘时会产生闪烁地现象,控件重绘频繁时,闪烁尤为明显。双缓冲机制可以有效地消除这种闪烁现象。自 Qt5 版本之后,QWidget 控件已经能够自动处理闪烁的问题。因此,在控件上直接绘图时,不用再操心显示的闪烁问题,但双缓冲机制在很多场合仍然有其用武之地。当所需绘制的内容较复杂并需要频繁刷新,或者每次只需要刷新整个控件的一小部分时,仍应尽量采用双缓冲机制。
实现一个简单的绘图工具,可以选择线型、线宽、颜色等基本要素。QMainWindow 对象作为主窗口,QToolBar 对象作为工具栏,QWidget 对象作为主窗口的中央窗体,也就是绘图区。通过响应鼠标事件进行绘图,而这是在绘图区窗体完成的,所以首先实现此窗体 DrawWidget 对鼠标事件进行重定义;然后实现可以选择线型、线宽及颜色等基本要素的主窗口。
二、绘图区的实现
DrawWidget 类继承自 QWidget 类,在类声明中对鼠标事件 mousePressEvent() 和 mouseMoveEvent(),重绘事件 paintEvent()、尺寸变化事件 resizeEvent() 进行了重定义。setStyle()、setWidth() 及 setColor() 函数主要用于为主窗口传递各种与绘图有关的参数。
(1)DrawWidget 构造函数完成对窗体参数及部分功能的初始化工作,具体代码如下:
DrawWidget::DrawWidget(QWidget *parent) : QWidget(parent)
{
setAutoFillBackground(true); //对窗体背景色的设置
setPalette(QPalette(Qt::white));
pix = new QPixmap(size()); //此QPixmap对象用于准备随时接收绘制的内容
pix->fill(Qt::white); //填充背景色为白色
setMinimumSize(600, 400); //设置绘制区窗体的最小尺寸
}
(2)setStyle() 函数接收主窗口传来的线型风格参数,setWidth() 函数接收主窗口传来的线宽参数值,setColor() 函数接收主窗口传来的画笔颜色值。具体代码如下:
void DrawWidget::setStyle(int s)
{
style = s;
}
void DrawWidget::setWidth(int w)
{
weight = w;
}
void Dra