8 绘图

8 绘图

QPainter基本绘图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QPainter    painter(this);//创建QPainter对象
painter.setRenderHint(QPainter::Antialiasing);//抗锯齿
painter.setRenderHint(QPainter::TextAntialiasing);//文字抗锯齿
QRect rect(W/4,H/4,W/2,H/2); //中间区域矩形框
//设置画笔
QPen pen;
pen.setWidth(3); //线宽
pen.setColor(Qt::red); //划线颜色
pen.setStyle(Qt::SolidLine);//线的类型,实线、虚线等
painter.setPen(pen);

//设置画刷
//QPixmap texturePixmap(":images/images/texture.jpg");
QBrush brush;
brush.setColor(Qt::yellow); //画刷颜色
brush.setStyle(Qt::SolidPattern); //画刷填充样式
painter.setBrush(brush);
painter.drawRect(rect); //只填充定义的渐变区域

坐标系统和坐标变换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//设计绘制五角星的PainterPath,以便重复使用
QPainterPath starPath;
starPath.moveTo(points[0]);
starPath.lineTo(points[2]);
starPath.lineTo(points[4]);
starPath.lineTo(points[1]);
starPath.lineTo(points[3]);
starPath.closeSubpath();//闭合路径,最后一个点与第一个点相连
starPath.addText(points[0],font,"0"); //显示端点编号
painter.save(); //保存坐标状态
painter.restore(); //恢复坐标状态
painter.translate(300,120); //平移
painter.scale(0.8,0.8); //缩放
painter.rotate(90); //顺时针旋转
painter.resetTransform(); //复位所有坐标变换

窗口和视口

视口 不会随着拉动改变大小,坐标原点位于左上角

窗口会随着拉动改变大小,坐标原点位于中心

窗口中的东西要投影到视口才能显示出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
painter.setViewport(rect);//设置Viewport
painter.setWindow(-50,-50,100,100); // 设置窗口大小,逻辑坐标

////线性渐变
QLinearGradient linearGrad(0,0,100,0);//从左到右,
linearGrad.setColorAt(0,Qt::yellow);//起点颜色
linearGrad.setColorAt(1,Qt::green);//终点颜色
linearGrad.setSpread(QGradient::PadSpread);//展布模式
painter.setBrush(linearGrad);
//径向渐变
//QRadialGradient radialGrad(50,0,50,50,0);
radialGrad.setColorAt(0,Qt::white);
//设置复合模式
painter.setCompositionMode(QPainter::CompositionMode_Difference);

Graphics View绘图架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//要将GraphicView继承才能实现事件重载
//class MyGraphicView : public QGraphicsView
//构造Graphics View的各项
QRectF rect(-200,-100,400,200);
scene=new QGraphicsScene(rect); //scene逻辑坐标系定义
ui->View->setScene(scene);

//画一个矩形框,大小等于scene
QGraphicsRectItem *item=new QGraphicsRectItem(rect); //矩形框正好等于scene的大小
item->setFlags(QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);//可选,可以有焦点,但是不能移动

QPen pen;
pen.setWidth(2);
item->setPen(pen);
//item->setPos(500,0);//缺省位置在scene的(0,0)
scene->addItem(item);
scene->clearSelection();

QPointF pointScene=ui->View->mapToScene(point); //转换到Scene坐标

{//鼠标单击事件
QPointF pointScene=ui->View->mapToScene(point); //转换到Scene坐标
QGraphicsItem *item=NULL;
item=scene->itemAt(pointScene,ui->View->transform()); //获取光标下的绘图项
if (item != NULL) //有绘图项
{
QPointF pointItem=item->mapFromScene(pointScene); //转换为绘图项的局部坐标
labItemCord->setText(QString::asprintf("Item 坐标:%.0f,%.0f", pointItem.x(),pointItem.y()));
}
}

绘图程序案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
template<class T> void setBrushColor(T *item)
{//函数模板
QColor color=item->brush().color();
color=QColorDialog::getColor(color,NULL,"选择填充颜色");
if (color.isValid())
item->setBrush(QBrush(color));
}

switch (item->type()) //绘图项的类型
{
case QGraphicsRectItem::Type: //矩形框
{ //强制类型转换
QGraphicsRectItem *theItem=qgraphicsitem_cast<QGraphicsRectItem*>(item);
setBrushColor(theItem);
break;
}
}
QGraphicsRectItem *item=new QGraphicsRectItem(-50,-25,100,50);//x,y 为左上角的图元局部坐标,图元中心点为0,0
item->setZValue(++frontZ);//表示是否在最底层,数值达的在外层
item->setPos(-50+(qrand() % 100),-50+(qrand() % 100));

scene->removeItem(item); //删除绘图项

int cnt=scene->selectedItems().count();
if (cnt>1)
{
QGraphicsItemGroup* group =new QGraphicsItemGroup; //创建组合
scene->addItem(group); //组合添加到场景中

for (int i=0;i<cnt;i++)
{
QGraphicsItem* item=scene->selectedItems().at(0);//注意0
qDebug()<<item->data(ItemId);
item->setSelected(false); //清除选择虚线框
item->clearFocus();
group->addToGroup(item); //添加到组合,因为每次加入到group,item就消失了,所以上面的at(0)
}
}

QGraphicsItemGroup *=(QGraphicsItemGroup*)scene->selectedItems().at(0);
scene->destroyItemGroup(group);//打撒组合
作者

步步为营

发布于

2024-05-08

更新于

2025-03-15

许可协议