日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt鼠标拖动绘制基本几何图形

發布時間:2025/1/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt鼠标拖动绘制基本几何图形 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

用Qt鼠標事件實現基本幾何圖形的繪制,支持直線、矩形、圓形、橢圓。后期可以在此基礎上進行擴展。

效果圖

實現

本示例使用QGraphics體系來實現,因為要移動對象,所以生成的圖形必須是一個單獨的對象,鼠標拖動繪制的過程是在臨時層中完成,release后生成一個矢量的圖形item并添加到場景中。

關鍵代碼

主場景中有一個父rootItem,在scene中將鼠標或觸控事件傳到rooitem后動態繪制臨時的圖形,release事件后生成一個標準的圖形對象:

void GsRootItem::drawPress(int id, const QPointF &p) {ShapeInfo info;info.firstPos = p;info.type = getCurType();m_Objs.insert(id,info); }void GsRootItem::drawMove(int id, const QPointF &lastPoint, const QPointF &curPoint) {if(!m_Objs.contains(id)){return;}ShapeInfo info = m_Objs.value(id);m_pTempLayer->drawShape(info.type,info.firstPos,curPoint); }void GsRootItem::drawRelease(int id, const QPointF &point) {if(!m_Objs.contains(id)){return;}ShapeInfo info = m_Objs.value(id);drawRealShape(info.type,info.firstPos,point);m_Objs.remove(id);m_pTempLayer->clear(); }... void GsRootItem::drawRealShape(GsShapeType type, QPointF p1, QPointF p2) {//計算圖形繪制區域QRectF rect;rect.setX(qMin(p1.x(),p2.x()));rect.setY(qMin(p1.y(),p2.y()));if(type == Shape_Circle){rect.setWidth(qAbs(p1.y() - p2.y()));rect.setHeight(qAbs(p1.y() - p2.y()));}else{rect.setWidth(qAbs(p1.x() - p2.x()));rect.setHeight(qAbs(p1.y() - p2.y()));}rect.adjust(-5,-5,5,5);GsShapeBaseItem * item = m_pShapeFactory->getShapeItem(type,rect,this);item->drawShape(p1,p2); }

drawRealShape函數就是用與創建一個獨立的幾何圖形,通過以下的工廠模式來生成

GsShapeBaseItem * item = m_pShapeFactory->getShapeItem(type,rect,this);

工廠代碼:

GsShapeBaseItem *GsShapeFactory::getShapeItem(GsShapeType type,QRectF rectF,QGraphicsObject *parent) {GsShapeBaseItem * item = nullptr;switch (type) {case Shape_Line:item = new GsShapeLineItem(rectF,parent);break;case Shape_Rectange:item = new GsShapeRectangeItem(rectF,parent);break;case Shape_Circle:item = new GsShapeCircleItem(rectF,parent);break;case Shape_Oval:item = new GsShapeOvalItem(rectF,parent);break;default:break;}item->setZValue(10);return item; }

在工廠類中會創建不同的圖形對象。每一個圖形對象是繼承于QGraphicsObject然后重寫paint函數去進行繪制,比如說原型:

void GsShapeCircleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {painter->setRenderHint(QPainter::Antialiasing);QColor color = Qt::red;//(rand()%255,rand()%255,rand()%255);painter->setBrush(color);if(m_bTap){painter->setPen(QPen(Qt::yellow,5,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));}else{painter->setPen(QPen(color,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));}painter->drawEllipse(m_firstPoint.x(),m_firstPoint.y(),qAbs(m_lastPoint.y() - m_firstPoint.y()),qAbs(m_lastPoint.y() - m_firstPoint.y())); }

其他圖形類似。

實現圖形的選擇和拖動,需要在item中添加以下兩句:

setFlag(ItemIsSelectable,true); setFlag(ItemIsMovable,true);

然后就可以自由拖動啦。

代碼太多, 就不全部列出來了,基本邏輯都很簡單。
代碼下載地址

github下載

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Qt鼠标拖动绘制基本几何图形的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。