画笔
QPen pen;
pen.setWidth(3); // 线条宽度
pen.setColor(Qt::red);// 画笔颜色
pen.setStyle(Qt::DashLine);// 线条样式
pen.setCapStyle(Qt::RoundCap);// 线端样式
pen.setJoinStyle(Qt::BevelJoin);// 连接样式
painter.setPen(pen);
线条
线端
连接
画刷
QBrush brush;
brush.setColor(Qt::yellow);// 颜色
brush.setStyle(Qt::SolidPattern);// 样式
brush.setTexture(QPixmap &pixmap);// 设置画刷图片
渐变
QRadialGradient rg(W/2,H/2,qMax(W/8,H/8),W/2,H/2);
rg.setColorAt(0,Qt::green);
rg.setColorAt(1,Qt::blue);
rg.setSpread(QGradient::ReflectSpread);
QLinearGradient
QRadialGradient
QConicalGradient
渐变模式
PadSpread
RepeatSpread
ReflectSpread
画家
可以画不同的基本图形元件
更复杂的图形用QPainterPath
对画家的操作
painter.rotate(15);//旋转
painter.translate(20,20);//平移
painter.scale(0.5,0.5);//坐标缩放
painter.shear(0.5,0.5);//扭转变换
painter.save();
painter.rotate(15);//旋转
painter.restore();
painter.drawRect(rect);
视口和窗口
物理设备提供最基本的坐标系,
通过各种变换得到逻辑坐标系,
为了更方便的操作,出现了视口坐标系和窗口坐标系,
视口表示绘图设备的任意一个矩形区域的物理坐标,默认情况下为整个绘图设备区域。
窗口与视口是同一个矩形,可以重新定义矩形区域的逻辑坐标。
视口设置为painter.setViewport(50,0,200,200)
,即物理设备的(50,0)
为左上角,绘制一个200的正方形,改形状为视口。但坐标系与物理坐标系一致。
然后使用painter.setViewport(-50,-50,100,100)
这里定义(50,0)
为(-50,-50)
且对长宽做了缩放,这里是缩小了,缩小到(100,100)
,以后的操作都是在100$\times$100的空间进行。
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::TextAntialiasing);
int W = this->width();
int H = this->height();
qDebug()<<W<<" "<< H;
int side = qMin(W,H);
QRect rect((W-side)/2,(H-side)/2,side,side);
painter.drawRect(rect);
painter.setViewport(rect);
painter.setWindow(-100,-100,200,200);
QPen pen;
pen.setWidth(2);
pen.setColor(Qt::red);
pen.setStyle(Qt::SolidLine);
painter.setPen(pen);
QLinearGradient linearGrad(0,0,100,0);
linearGrad.setColorAt(0,Qt::yellow);
linearGrad.setColorAt(1,Qt::green);
linearGrad.setSpread(QGradient::PadSpread);
painter.setBrush(linearGrad);
//painter.setCompositionMode(QPainter::RasterOp_NotSourceXorDestination);
painter.setCompositionMode(QPainter::CompositionMode_Difference);
for(int i = 0; i < 36; i++){
painter.drawEllipse(QPoint(50,0),50,50);
painter.rotate(10);
}
运行结果