Qt::绘制框架-选择节点-QGraphicsScene-items

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

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

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


目录

选择节点

一、选择节点操作原理

二、矩形框选实现

1.代码示例

2.示例效果

三、套索自定义选择实现

1.代码示例

2.示例效果

​​​​​​​​​​​​​​四、选择节点软件测试视频

结束语


选择节点

本篇介绍软件左侧工具栏→绘制工具→​​​​选择节点​​​

选择节点的框线方式有2种:1)矩形框选;2)套索自定义选择。​​​​​​​


一、选择节点操作原理

对于矢量图层,为了对特定的节点进行变换等操作,需要先选择特定节点,而选中的位置节点及其曲率控制节点采用笔刷(QBrush类型)的setStyle(Qt::SolidPattern)和setColor(Qt::red)进行标记区分,当被取消选择时,则笔刷需要更新setStyle(Qt::NoBrush)。选择节点具体实现流程为:

① 鼠标移动绘制选择区域;

② 采用QGraphicsScenescene的items方法(参数详见Qt官方文件)拿到Qlist<QGraphicsItem *>集合group;

③ group可能为空,若不为空,还需遍历group的所有子物体,满足条件的才是真正的节点集合,一般判断条件包括:可见判断、节点类型判断和父对象判断等;

④ 当选择节点之后,节点才处于可编辑状态。

另,QGraphicsScene中有setSelectionArea方法经过调整也可以实现选择节点功能,需要注意的使用此方法前,需要启用QGraphicsItem的setFlag中的QGraphicsItem::ItemIsSelectable。

根据鼠标绘制区域的不同,可分为矩形框选和套索自定义选择2种,其中,矩形框选即选择区域为矩形,套索自定义选择区域为鼠标移动路径绘制出的封闭区域。

二、矩形框选实现

1.代码示例

.h文件变量申明:

QPainterPath pathForSelect;

QGraphicsPathItem *pathForSelectItem;

QPointF startNodePos,endNodePos;

void Scene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    startNodePos = mouseEvent->scenePos();
}

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    endNodePos = mouseEvent->scenePos();
    pathForSelect.clear();
    pathForSelect.addRect(startNodePos.x(),startNodePos.y(),endNodePos.x()-startNodePos.x(),endNodePos.y()-startNodePos.y());
    pathForSelectItem->setPath(pathForSelect);
}

2.示例效果

框选

三、套索自定义选择实现

1.代码示例

.h文件变量申明:

QPainterPath pathForSelect;

QGraphicsPathItem *pathForSelectItem;

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    if(isLassoMode)
    {
       pathForSelect.lineTo(mouseEvent->scenePos());
       pathForSelectItem->setPath(pathForSelect);
    }
}

2.示例效果

套索选择


​​​​​​​​​​​​​​四、选择节点软件测试视频

选择节点

​​​​​​​


结束语

本文简要梳理了软件【选择节点】的实现框架,内容均为原创。

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

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <QtWidgets>class MyItem : public QGraphicsObject{public: MyItem(int pinCount, QColor color, QSizeF size, QGraphicsItem* parent = nullptr) : QGraphicsObject(parent) , m_pinCount(pinCount) , m_color(color) , m_size(size) {} QRectF boundingRect() const override { return QRectF(QPointF(0, 0), m_size); } QPainterPath shape() const override { QPainterPath path; path.addRect(QRectF(QPointF(0, 0), m_size)); return path; } void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override { Q_UNUSED(option) Q_UNUSED(widget) painter->setPen(Qt::NoPen); painter->setBrush(m_color); painter->drawRect(boundingRect()); painter->setPen(Qt::black); painter->setFont(QFont("Arial", 10)); painter->drawText(boundingRect(), Qt::AlignCenter, QString("%1 pins").arg(m_pinCount)); } void mousePressEvent(QGraphicsSceneMouseEvent* event) override { if (event->button() == Qt::LeftButton) { setCursor(Qt::ClosedHandCursor); m_lastPos = event->scenePos(); } } void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override { if (QLineF(event->screenPos(), m_lastPos).length() < QApplication::startDragDistance()) return; QGraphicsObject::mouseMoveEvent(event); setPos(pos() + event->scenePos() - m_lastPos); m_lastPos = event->scenePos(); } void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override { if (event->button() == Qt::LeftButton) { setCursor(Qt::ArrowCursor); } }private: int m_pinCount; QColor m_color; QSizeF m_size; QPointF m_lastPos;};int main(int argc, char* argv[]){ QApplication app(argc, argv); QGraphicsScene scene; scene.setSceneRect(0, 0, 800, 600); MyItem* item1 = new MyItem(8, Qt::red, QSizeF(80, 60)); item1->setPos(100, 100); scene.addItem(item1); MyItem* item2 = new MyItem(16, Qt::green, QSizeF(120, 80)); item2->setPos(300, 200); scene.addItem(item2); QGraphicsView view(&scene); view.setRenderHint(QPainter::Antialiasing); view.setDragMode(QGraphicsView::RubberBandDrag); view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate); view.show(); return app.exec();}在这个代码中,如何使用TextOut去给矩形框中添加文本
05-17

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值