• Qt::绘制框架-删除线段-QGraphicsScene-removeItem


    二维矢量动画智能制作软件开发合集

    链接:软件开发技术分享及记录合集

    个人开发二维矢量动画智能制作软件界面如下:


    目录

    删除矢量线段

    一、删除线段原理

    二、撤销框架实现

    1.代码示例

    2.示例效果

    三、删除线段代码实现

    1.代码示例

    2.示例效果-封闭图形删除线段

    3.示例效果-不封闭图形删除线段

    ​​​​​​​​​​​​​​四、删除矢量线段软件测试视频

    结束语


    删除矢量线段

    本篇介绍软件左侧工具栏→绘制工具→​​​​删除矢量线段​​​

    根据矢量线段在不同形状里所处位置,可将矢量线段划分为:1)封闭形状的线段;2)不封闭形状的线段。


    一、删除线段原理

    ① 对于封闭形状,删除线段操作需要删除:1)本线段;2)封闭形状;3)线段起始节点的曲率控制节点及其手柄;4)线段终止节点的曲率控制节点及其手柄。

    ② 对于不封闭形状,删除线段操作需要删除:1)本线段;2)封闭形状;3)线段起始节点的曲率控制节点及其手柄;4)线段终止节点的曲率控制节点及其手柄;5)若线段为未封闭形状的起始线段,则删除线段起始节点;6)若线段为未封闭形状的终止线段,则删除线段终止节点。

    另,删除后发现需要取消本次删除,则需要引入撤销指令,本软件采用Qt的QUndoStack来实现撤销及重做指令。

    本篇结合QUndoCommand来实现删除线段功能。

    二、撤销框架实现

    1.代码示例

    .h文件变量申明:

    QUndoStack *m_undoStack;   

    QGraphicsItem *tmp;

    1. /*【获取undostack】*/
    2. void Scene::getUndostack(QUndoStack *undoStack)
    3. {
    4. m_undoStack = undoStack;
    5. }
    6. void Scene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
    7. {
    8. m_undoStack->push(new deletePathCmd(qgraphicsitem_cast(tmp)));
    9. }

    2.示例效果

    (nullptr)

    三、删除线段代码实现

    1.代码示例

    1. /*【删除线段】*/
    2. class deletePathCmd :public QUndoCommand
    3. {
    4. public :
    5. deletePathCmd(QGraphicsItem *lineItem = nullptr);
    6. void redo() override;
    7. void undo() override;
    8. private:
    9. QGraphicsItem *m_lineItem;
    10. bool hasP1 = false,hasP2 = false,hasStroke = false;
    11. QGraphicsObject *m_p1,*m_p2,*m_c1,*m_c2,*m_strokeSeg,*m_c1Curve,*m_c2Curve;
    12. QGraphicsItem *m_parentItem,*m_posParentItem,*m_curveParentItem,*m_strokeParentItem;
    13. QGraphicsScene *m_scene;
    14. };
    15. /*【删除线段 - 申明】*/
    16. deletePathCmd::deletePathCmd(QGraphicsItem *lineItem)
    17. {
    18. m_lineItem = lineItem;
    19. m_parentItem = m_lineItem->parentItem();
    20. m_scene = m_lineItem->scene();
    21. }
    22. /*【删除线段 - redo】*/
    23. void deletePathCmd::redo()
    24. {
    25. if(m_lineItem->m_strokeSeg != nullptr)
    26. {
    27. hasStroke = true;
    28. m_strokeSeg = m_lineItem->m_strokeSeg;
    29. m_strokeParentItem = m_lineItem->m_strokeSeg->parentItem();
    30. m_scene->removeItem(m_lineItem->m_strokeSeg);
    31. }
    32. int num = 0;
    33. for(int i = 0; im_p1->curveG.count(); i++)
    34. if(m_lineItem->m_p1->curveG[i]->isVisible())
    35. num++;
    36. if(num == 1)
    37. {
    38. hasP1 = true;
    39. m_p1 = m_lineItem->m_p1;
    40. m_posParentItem = m_lineItem->m_p1->parentItem();
    41. m_scene->removeItem(m_lineItem->m_p1);
    42. }
    43. num = 0;
    44. for(int i = 0; im_p2->curveG.count(); i++)
    45. if(m_lineItem->m_p2->curveG[i]->isVisible())
    46. num++;
    47. if(num == 1)
    48. {
    49. hasP2 = true;
    50. m_p2 = m_lineItem->m_p2;
    51. m_posParentItem = m_lineItem->m_p2->parentItem();
    52. m_scene->removeItem(m_lineItem->m_p2);
    53. }
    54. m_curveParentItem = m_lineItem->m_c1->parentItem();
    55. m_c1 = m_lineItem->m_c1;
    56. m_c2 = m_lineItem->m_c2;
    57. m_c1Curve = m_lineItem->m_c1->m_curveLine;
    58. m_c2Curve = m_lineItem->m_c2->m_curveLine;
    59. m_scene->removeItem(m_c1);
    60. m_scene->removeItem(m_c1Curve);
    61. m_lineItem->m_c1->hide();
    62. m_c1Curve->hide();
    63. m_scene->removeItem(m_lineItem->m_c2->m_curveLine);
    64. m_scene->removeItem(m_lineItem->m_c2);
    65. m_lineItem->m_c2->hide();
    66. m_c2Curve->hide();
    67. m_scene->removeItem(m_lineItem);
    68. m_lineItem->hide();
    69. m_scene->update();
    70. }
    71. /*【删除线段 - undo】*/
    72. void deletePathCmd::undo()
    73. {
    74. m_lineItem->setParentItem(m_parentItem);
    75. m_lineItem->show();
    76. m_c1->setParentItem(m_curveParentItem);
    77. m_c1->show();
    78. m_c2->setParentItem(m_curveParentItem);
    79. m_c2->show();
    80. m_c1Curve->setParentItem(m_curveParentItem);
    81. m_c1Curve->show();
    82. m_c2Curve->setParentItem(m_curveParentItem);
    83. m_c2Curve->show();
    84. if(hasP1)
    85. m_p1->setParentItem(m_posParentItem);
    86. if(hasP2)
    87. m_p2->setParentItem(m_posParentItem);
    88. if(hasStroke)
    89. m_strokeSeg->setParentItem(m_strokeParentItem);
    90. m_scene->update();
    91. }

    2.示例效果-封闭图形删除线段

    封闭图形删除边线

    3.示例效果-不封闭图形删除线段

    不封闭图形删除边线


    ​​​​​​​​​​​​​​四、删除矢量线段软件测试视频

    删除边线测试


    结束语

    本文简要梳理了软件【删除矢量线段】的实现框架,内容均为原创。

    作者文笔水平一般,请大家多多包涵和指正,十分欢迎进一步交流学习。

    若需,请联系本人小红书(小红书号:YzLab96),谢谢​​​​​​​。

    链接:  软件开发及测试所有视频合集见小红书​​​​​​​

  • 相关阅读:
    C# 12 拦截器 Interceptors
    python+Tesseract OCR实现截屏识别文字
    【Python百日刷题计划】Day10~一些编程题练习
    OJ输入输出练习
    [附源码]计算机毕业设计springboot房屋租赁系统
    Python | eval、exec | 执行动态代码字符串
    20220701 Barbalat引理证明
    最初购买的ios开发者账户无法续费怎么办
    C++笔记之文档术语——将可调用对象作为函数参数
    『现学现忘』Git基础 — 3、Git介绍
  • 原文地址:https://blog.csdn.net/yzl140/article/details/132634353