二维矢量动画智能制作软件开发合集
个人开发二维矢量动画智能制作软件界面如下:
目录
填充图形
本篇介绍软件左侧工具栏→填充工具→填充图形选择 、填充图形删除、和填充增加
填充图形功能参数设计如下:
一、填充图形选择|删除|增加原理
本软件中对填充图形定义包括填充及其轮廓,根据设置是否有填充及是否有轮廓,对于填充图形的操作包括选择、删除和增加。
① 填充图形选择实现原理:填充选择采用QGraphicsScene的items()方法,通过QGraphicsItem子对象的type()是否为填充类型判断是否是当前选择对象,当子对象存在堆叠现象时,本软件默认选择最顶层的对象;
② 填充图形删除实现原理:因为删除是删除整个对象,采用QGraphicsScene的removeItem()方法即可,鼠标点选填充图形 若填充有轮廓 则填充和轮廓一起删除,若鼠标点击处存在多个图形堆叠现象,按照图形的z值排序,删除最顶层的图形。另外,该功能需要实现撤销及重做操作,可采用QUndoCommand类;
③ 填充图形增加实现原理:鼠标点选线段,注意本功能要求按照连接顺序依次选择,经过判断线段连续且首尾相接的线段,判断为封闭图形,生成填充图形及其轮廓,经过判断线段连续但未首尾相接,判断为未封闭图形,生成轮廓。
二、填充图形选择实现
1.代码示例
.h文件变量申明:
QPainterPath pathForSelect;
QList<myItem *> FillItems;
void Scene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
QList<QGraphicsItem *> tmp = items(pathForSelect, Qt::IntersectsItemBoundingRect);
if(!tmp.isEmpty())
{
for(int i = 0; i < tmp.count(); i++)
if(tmp[i]->type() == myItem::Type)
{
a = qgraphicsitem_cast<myItem *>(tmp[i]);
FillItems.append(a);
}
}
}
2.示例效果
填充选择
三、填充图形删除实现
1.代码示例
.h文件变量申明:
class deleteFillCmd :public QUndoCommand
{
public:
deleteFillCmd(fillItem *fillSeg = nullptr);
void redo() override;
void undo() override;
};
deleteFillCmd::deleteFillCmd(fillItem *fillSeg)
{
m_fillSeg = fillSeg;
m_parentItem = m_fillSeg->parentItem();
m_fillPathG = m_fillSeg->m_fillPathG;
if(m_fillPathG[0]->m_strokeSeg)
m_strokeParentItem = m_fillPathG[0]->m_strokeSeg->parentItem();
m_scene = m_fillSeg->scene();
}
/*【删除填充 - redo】*/
void deleteFillCmd::redo()
{
m_scene->removeItem(m_fillSeg);
m_fillSeg->hide();
for(int i = 0; i < m_fillPathG.count(); i++)
if(m_fillPathG[i]->m_strokeSeg)
{
m_scene->removeItem(m_fillPathG[i]->m_strokeSeg);
m_fillPathG[i]->show();
}
m_scene->update();
}
/*【删除填充 - undo】*/
void deleteFillCmd::undo()
{
m_fillSeg->show();
m_fillSeg->setParentItem(m_parentItem);
for(int i = 0; i < m_fillPathG.count(); i++)
if(m_fillPathG[i]->m_strokeSeg)
m_fillPathG[i]->m_strokeSeg->setParentItem(m_strokeParentItem);
m_scene->update();
}
2.示例效果
删除填充
四、填充图形增加实现
1.代码示例
.h文件变量申明:
bool isClose = true; // 是否封闭
QListh<QGraphicsItem *> fillPath;
for(int i = 0 ; i < fillPath.count()-1 ; i++)
if(fillPath[i]->m_p2 != fillPath[i+1]->m_p1)
{
isClose = false;
break;
}
2.示例效果
增加填充
五、填充图形选择|删除|增加软件测试视频
填充测试
结束语
本文简要梳理了软件【填充图形选择|删除|增加】的实现框架,内容均为原创。
作者文笔水平一般,请大家多多包涵和指正,十分欢迎进一步交流学习。
若需,请联系本人小红书(小红书号:YzLab96),谢谢。
链接: 软件开发及测试所有视频合集见小红书