void UBAbstractDrawRuler::create(QGraphicsItem& item) { item.setFlag(QGraphicsItem::ItemIsMovable, true); item.setFlag(QGraphicsItem::ItemIsSelectable, true); item.setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); item.setAcceptsHoverEvents(true); mCloseSvgItem = new QGraphicsSvgItem(":/images/closeTool.svg", &item); mCloseSvgItem->setVisible(false); mCloseSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); }
// draw text void ScenePainter::drawText(const char * const *strs, double *x, double *y, int n, Qt::Alignment flags, double rot, double hcex, double vcex) { if (indexMode()) { QVector<QRectF> rects = textExtents(strs, n, flags); for (int i = 0; i < n; i++) { QString qstr = QString::fromLocal8Bit(strs[i]); QPointF center = rects[i].center(); double xi = x[i] + center.x(); double yi = y[i] + center.y(); drawPoints(&xi, &yi, 1); } return; } // FIXME: alignment is ignored -- translate to HTML? QTransform posTform = transform(); QTransform textTform; textTform.rotate(-rot); textTform.scale(hcex, vcex); for (int i = 0; i < n; i++) { QString qstr = QString::fromLocal8Bit(strs[i]); QGraphicsItem *item = STORE_INDEX(_scene->addText(qstr, _scene->font())); item->setFlag(QGraphicsItem::ItemIgnoresTransformations); item->setPos(posTform.map(QPointF(x[i], y[i]))); item->setTransform(textTform); } }
int main(int argc, char *argv[]) { QApplication a(argc, argv); QGraphicsView gv; QGraphicsScene *scene = new QGraphicsScene(&gv); gv.setScene(scene); QGraphicsItem *rect = scene->addRect(0, 0, 200, 200, QPen(Qt::NoPen), QBrush(Qt::yellow)); rect->setFlag(QGraphicsItem::ItemHasNoContents); rect->setFlag(QGraphicsItem::ItemClipsChildrenToShape); QGraphicsItem *childRect = scene->addRect(0, 0, 100, 100, QPen(Qt::NoPen), QBrush(Qt::red)); childRect->setParentItem(rect); gv.show(); MyObject o(rect); QMessageBox::information(0, "What you should see", "The red rectangle should toggle visiblity, so you should see it flash on and off"); return a.exec(); }
void ScenePainter::drawCircle(double x, double y, int r) { QRectF rect; if (indexMode()) { float minFloat = std::numeric_limits<float>::min(); rect = QRectF(0, 0, minFloat, minFloat); } else rect = QRectF(-r, -r, 2*r, 2*r); QGraphicsItem *item = STORE_INDEX(_scene->addEllipse(rect, pen(), brush())); item->setFlag(QGraphicsItem::ItemIgnoresTransformations); item->setPos(transform().map(QPointF(x, y))); }
void CSharedPainterScene::moveItem( boost::shared_ptr<CPaintItem> item, double x, double y ) { if( ! item ) return; if( ! item->drawingObject() ) return; clearLastItemBorderRect(); QGraphicsItem* i = reinterpret_cast<QGraphicsItem *>(item->drawingObject()); // freeze move changes notify i->setFlag( QGraphicsItem::ItemSendsGeometryChanges, false ); i->setPos( x, y ); // thaw move changes notify i->setFlag( QGraphicsItem::ItemSendsGeometryChanges, true ); invalidate( i->boundingRect() ); }
// draw points (pixels) void ScenePainter::drawPoints(double *x, double *y, int n) { QTransform tform = transform(); QPen pen = this->pen(); // seems that 0-size items are ignored, so we use min size float minFloat = std::numeric_limits<float>::min(); QSizeF size = indexMode() ? QSizeF(minFloat, minFloat) : QSizeF(1, 1); for (int i = 0; i < n; i++) { QRectF rect = QRectF(QPointF(0, 0), size); QGraphicsItem *item = STORE_INDEX(_scene->addRect(rect, pen)); item->setFlag(QGraphicsItem::ItemIgnoresTransformations); item->setPos(tform.map(QPointF(x[i], y[i]))); } }
// drawing glyphs (same path, many places) void ScenePainter::drawGlyphs(const QPainterPath &path, double *x, double *y, double *size, QColor *stroke, QColor *fill, int n) { if (indexMode()) { drawPoints(x, y, n); } else if (!rasterize()) { QTransform tform = transform(); double curSize = glyphSize(); for (int i = 0; i < n; i++) { if (stroke) setStrokeColor(stroke[i]); if (fill) setFillColor(fill[i]); QGraphicsItem *item = STORE_INDEX(_scene->addPath(path, pen(), brush())); item->setPos(tform.map(QPointF(x[i], y[i]))); item->setFlag(QGraphicsItem::ItemIgnoresTransformations); if (size) curSize = size[i]; item->scale(curSize, curSize); } } else QtBasePainter::drawGlyphs(path, x, y, size, stroke, fill, n); }
// image void ScenePainter::drawImage(const QImage &image, double x, double y, int sx, int sy, int sw, int sh) { if (indexMode()) { x = (sw < 0 ? image.width() : sw) / 2.0; y = (sh < 0 ? image.height() : sh) / 2.0; drawPoints(&x, &y, 1); return; } QImage subImage; if (sw >= 0 || sh >= 0 || sx > 0 || sy > 0) { sw = sw < 0 ? image.width() : sw; sh = sh < 0 ? image.height() : sh; subImage = image.copy(sx, sy, sw, sh); } else subImage = image; QPixmap pixmap = QPixmap::fromImage(subImage); QGraphicsItem *item = STORE_INDEX(_scene->addPixmap(pixmap)); item->setPos(transform().map(QPointF(x, y))); item->setFlag(QGraphicsItem::ItemIgnoresTransformations); }
QGraphicsItem *QRecipeTableItem::Clone() { QGraphicsItem *pCopy = NULL; QGraphicsItem * pItem= NULL; QRecipeTableItem *itemGroup = new QRecipeTableItem(); QList<QGraphicsItem *> itemList; itemList = childItems(); int size = itemList.size(); for(int i=0;i<size;i++) { pItem = itemList.at(i); switch(pItem->type()) { case SAM_DRAW_OBJECT_RECT: //矩形 { QRectItem *rectItem = dynamic_cast<QRectItem *>(pItem); if(rectItem) { pCopy = rectItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_ELIPSE: //圆 { QElipseItem *elipseItem = dynamic_cast<QElipseItem *>(pItem); if(elipseItem) { pCopy = elipseItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_LINE: //直线 { QLineItem * lineItem = dynamic_cast<QLineItem *>(pItem); if(lineItem) { pCopy = lineItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_POLYGON: //多边形 { QPolygonItem *polygonItem = dynamic_cast<QPolygonItem *>(pItem); if(polygonItem) { pCopy = polygonItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_FOLDLINE: //19 { QFoldLineItem *foldlineItem = dynamic_cast<QFoldLineItem *>(pItem); if(foldlineItem) { pCopy = foldlineItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_FREELINE: //20 { QFreeLineItem * freelineItem = dynamic_cast<QFreeLineItem *>(pItem); if(freelineItem) { pCopy = freelineItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_TEXT: //22 { QSimpleTextItem * textItem = dynamic_cast<QSimpleTextItem *>(pItem); if(textItem) { pCopy = textItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_PIXMAP: { QPixmapItem *pixmapItem = dynamic_cast<QPixmapItem *>(pItem); if(pixmapItem) { pCopy = pixmapItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_LINECIRCLE: //25 { QLineCircleItem *circleItem = dynamic_cast<QLineCircleItem *>(pItem); if(circleItem) { pCopy = circleItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_ROUNDEDRECT: { QRoundedRect *roundedrectItem = dynamic_cast<QRoundedRect *>(pItem); if(roundedrectItem) { pCopy = roundedrectItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_ARC: { QArcItem *arcItem = dynamic_cast<QArcItem *>(pItem); if(arcItem) { pCopy = arcItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_GROUP: //23 { QItemGroup *group = dynamic_cast<QItemGroup *>(pItem); if(group) { pCopy = group->Clone(); itemGroup->addToGroup(pCopy); } break; } default: break; } if(pCopy) pCopy->setFlag(QGraphicsItem::ItemIsSelectable,false); } itemGroup->SaveSecurityPro(&sPro); itemGroup->SaveInfo(m_SaveInfo); itemGroup->setData(GROUP_NAME_KEY,data(GROUP_NAME_KEY).toString()); itemGroup->setData(GROUP_TYPE_KEY,data(GROUP_TYPE_KEY).toInt()); itemGroup->setId(id()); if(itemGroup->childItems().size() == 0) { delete itemGroup; itemGroup = NULL; } return itemGroup; //return QItemGroup::Clone(); //return 0; //需要在派生类实例化对象,复制部分无法重用基类代码 }
//确定按钮的事件 void QMultiCopy::on_OK_clicked() { // QPLC_Struct *PLC_P=NULL; QList<QGraphicsItem *> selList=pwnd->pSceneSheet[pwnd->nActiveSheetIndex]->selectedItems(); if(selList.size()!=1)//选择多个或者没有 { accept(); return; } else{ DrawItemToScene CopyFun; int nItemWidth=0; int nItemHeight=0; if(ui->Overlap->isChecked()) { nItemWidth=0; nItemHeight=0; } else { nItemWidth=selList.at(0)->boundingRect().width(); nItemHeight=selList.at(0)->boundingRect().height(); } qreal bottom;//基准控件的底边界值 qreal right;//基准控件的右边界值 int nColumn=ui->Column->value();//行数 int nColumn_Interval=ui->Column_Interval->value();//行间隔 int nRow=ui->Row->value();//列数 int nRow_Interval=ui->Row_Interval->value();//列间隔 qreal scence_h=pwnd->pSceneSheet[pwnd->nActiveSheetIndex]->sceneRect().height(); qreal scence_w=pwnd->pSceneSheet[pwnd->nActiveSheetIndex]->sceneRect().width(); QGraphicsItem * pCopyTem = NULL; QGraphicsItem * pTem = NULL; QList<QGraphicsItem *> addItemsList; CopyFun.CopyItem(&pCopyTem,selList.at(0)); if(R_Alignment_Group->checkedId() == 1)//默认情况下,选中的是向右递增 { for(int j=0;j<nRow;j++) { for(int i=0;i<nColumn-1;i++) { if((pCopyTem->type()==SAM_DRAW_OBJECT_ROUNDEDRECT_NEW)||(pCopyTem->type() ==SAM_DRAW_OBJECT_ARC_NEW))//判断是否为圆角矩形或者扇形 { right=pCopyTem->sceneBoundingRect().right(); } else { right=pCopyTem->boundingRect().right(); } qreal item_x=right+(i+1)*(nColumn_Interval+nItemWidth);//计算边界值是否越界 if(item_x>scence_w)//若复制的大小越界的话 {//退出循环 break; } CopyFun.CopyItem(&pTem,pCopyTem); pwnd->pSceneSheet[pwnd->nActiveSheetIndex]->addItem(pTem); addItemsList.push_back(pTem); if((pCopyTem->type()==SAM_DRAW_OBJECT_ROUNDEDRECT_NEW)||(pCopyTem->type() ==SAM_DRAW_OBJECT_ARC_NEW))//判断是否为圆角矩形或者扇形 { pTem->setPos(pTem->sceneBoundingRect().topLeft().x()+(nItemWidth+nColumn_Interval)*(i+1), pTem->sceneBoundingRect().topLeft().y()); } else { pTem->setPos((nItemWidth+nColumn_Interval)*(i+1),0); } pTem->setFlag(QGraphicsItemGroup::ItemIsMovable, true); pTem->setFlag(QGraphicsItemGroup::ItemIsSelectable, true); pTem=NULL; } if(j<nRow-1) { qreal item_y; // int hight=pCopyTem->sceneBoundingRect().height(); if((pCopyTem->type()==SAM_DRAW_OBJECT_ROUNDEDRECT_NEW)||(pCopyTem->type() ==SAM_DRAW_OBJECT_ARC_NEW))//判断是否为圆角矩形或者扇形 { bottom=pCopyTem->sceneBoundingRect().bottom(); item_y=bottom+(nRow_Interval+nItemHeight);//计算边界值是否越界 } else { bottom=pCopyTem->boundingRect().bottom(); item_y=bottom+(nRow_Interval+nItemHeight)*(j+1);//计算边界值是否越界 } if(item_y>scence_h)//若复制的大小越界的话 {//退出循环 break; } CopyFun.CopyItem(&pCopyTem,selList.at(0)); //MuCopyList(*pCopyTem,CopyCount,NormKeyboardstr); //pwnd->pSceneSheet[pwnd->nActiveSheetIndex]->setNewItem_ID(pCopyTem,NouseItem ); pwnd->pSceneSheet[pwnd->nActiveSheetIndex]->addItem(pCopyTem); addItemsList.push_back(pCopyTem); if((pCopyTem->type()==SAM_DRAW_OBJECT_ROUNDEDRECT_NEW)||(pCopyTem->type() ==SAM_DRAW_OBJECT_ARC_NEW))//判断是否为圆角矩形或者扇形 { pCopyTem->setPos(pCopyTem->sceneBoundingRect().topLeft().x(),(nItemHeight+nRow_Interval)*(j+1)+ pCopyTem->sceneBoundingRect().topLeft().y()); } else { pCopyTem->setPos(0,(nItemHeight+nRow_Interval)*(j+1)); } pCopyTem->setFlag(QGraphicsItemGroup::ItemIsMovable, true); pCopyTem->setFlag(QGraphicsItemGroup::ItemIsSelectable, true); //pwnd->AndTreeSubItem(pCopyTem); //pwnd->upDatetreeScreenItem();//更新画面的子项 } } } else if(R_Alignment_Group->checkedId() == 2)//选中的是向下递增 { for(int i=0;i<nColumn;i++) { for(int j=0;j<nRow-1;j++) { if((pCopyTem->type()==SAM_DRAW_OBJECT_ROUNDEDRECT_NEW)||(pCopyTem->type() ==SAM_DRAW_OBJECT_ARC_NEW))//判断是否为圆角矩形或者扇形 { bottom=pCopyTem->sceneBoundingRect().bottom(); } else { bottom=pCopyTem->boundingRect().bottom(); } qreal item_y=bottom+(j+1)*(nRow_Interval+nItemHeight);//计算边界值是否越界 // 若复制的大小越界的话 if(item_y>scence_h) break; CopyFun.CopyItem(&pTem,pCopyTem); pwnd->pSceneSheet[pwnd->nActiveSheetIndex]->addItem(pTem); addItemsList.push_back(pTem); if((pCopyTem->type()==SAM_DRAW_OBJECT_ROUNDEDRECT_NEW)||(pCopyTem->type() ==SAM_DRAW_OBJECT_ARC_NEW))//判断是否为圆角矩形或者扇形 { pTem->setPos(pTem->sceneBoundingRect().topLeft().x(),(nItemHeight+nRow_Interval)*(j+1)+ pTem->sceneBoundingRect().topLeft().y()); } else { pTem->setPos(0,(nItemHeight+nRow_Interval)*(j+1)); } pTem->setFlag(QGraphicsItemGroup::ItemIsMovable, true); pTem->setFlag(QGraphicsItemGroup::ItemIsSelectable, true); pTem=NULL; } if(i<nColumn-1) { qreal item_x; if((pCopyTem->type()==SAM_DRAW_OBJECT_ROUNDEDRECT_NEW)||(pCopyTem->type() ==SAM_DRAW_OBJECT_ARC_NEW))//判断是否为圆角矩形或者扇形 { right=pCopyTem->sceneBoundingRect().right(); item_x=right+(nColumn_Interval+nItemWidth);//计算边界值是否越界 } else { right=pCopyTem->boundingRect().right(); item_x=right+(i+1)*(nColumn_Interval+nItemWidth);//计算边界值是否越界 } //若复制的大小越界的话 if(item_x>scence_w) break; CopyFun.CopyItem(&pCopyTem,selList.at(0)); pwnd->pSceneSheet[pwnd->nActiveSheetIndex]->addItem(pCopyTem); addItemsList.push_back(pCopyTem); if((pCopyTem->type()==SAM_DRAW_OBJECT_ROUNDEDRECT_NEW)||(pCopyTem->type() ==SAM_DRAW_OBJECT_ARC_NEW))//判断是否为圆角矩形或者扇形 { pCopyTem->setPos(pCopyTem->sceneBoundingRect().topLeft().x()+(nItemWidth+nColumn_Interval)*(i+1), pCopyTem->sceneBoundingRect().topLeft().y()); } else { pCopyTem->setPos((nItemWidth+nColumn_Interval)*(i+1),0); } pCopyTem->setFlag(QGraphicsItemGroup::ItemIsMovable, true); pCopyTem->setFlag(QGraphicsItemGroup::ItemIsSelectable, true); } } } if(ui->if_Increse_Address->isChecked()) { //设置地址增加 QList<QGraphicsItem *> itemList = addItemsList; qDebug() << "multiCopy size ----"<< itemList.size(); setMulitAddrs(itemList,selList.at(0)); } pwnd->undoStack->push(new multiCopyCommand(pwnd->pSceneSheet[pwnd->nActiveSheetIndex],addItemsList,selList[0],true)); } pwnd->PreviewWindow(); accept(); }
DynCircleAttr* DynCircleAttr::Clone() //复制item { QGraphicsItem* pCopy = NULL; QGraphicsItem* pItem = NULL; DynCircleAttr *itemGroup = new DynCircleAttr; QList<QGraphicsItem *> itemList; itemList = childItems(); int size = itemList.size(); for(int i=0;i<size;i++) { pItem = itemList.at(i); switch(pItem->type()) { case SAM_DRAW_OBJECT_RECT: //矩形 { QRectItem *rectItem = dynamic_cast<QRectItem *>(pItem); if(rectItem) { pCopy = rectItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_ELIPSE: //圆 { QElipseItem *elipseItem = dynamic_cast<QElipseItem *>(pItem); if(elipseItem) { pCopy = elipseItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_LINE: //直线 { QLineItem * lineItem = dynamic_cast<QLineItem *>(pItem); if(lineItem) { pCopy = lineItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_POLYGON: //多边形 { QPolygonItem *polygonItem = dynamic_cast<QPolygonItem *>(pItem); if(polygonItem) { pCopy = polygonItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_FOLDLINE: //19 { QFoldLineItem *foldlineItem = dynamic_cast<QFoldLineItem *>(pItem); if(foldlineItem) { pCopy = foldlineItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_FREELINE: //20 { QFreeLineItem * freelineItem = dynamic_cast<QFreeLineItem *>(pItem); if(freelineItem) { pCopy = freelineItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_TEXT: //22 { QSimpleTextItem * textItem = dynamic_cast<QSimpleTextItem *>(pItem); if(textItem) { pCopy = textItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_PIXMAP: { QPixmapItem *pixmapItem = dynamic_cast<QPixmapItem *>(pItem); if(pixmapItem) { pCopy = pixmapItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_LINECIRCLE: //25 { QLineCircleItem *circleItem = dynamic_cast<QLineCircleItem *>(pItem); if(circleItem) { pCopy = circleItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_ROUNDEDRECT: { QRoundedRect *roundedrectItem = dynamic_cast<QRoundedRect *>(pItem); if(roundedrectItem) { pCopy = roundedrectItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_ARC: { QArcItem *arcItem = dynamic_cast<QArcItem *>(pItem); if(arcItem) { pCopy = arcItem->Clone(); itemGroup->addToGroup(pCopy); } break; } case SAM_DRAW_OBJECT_GROUP: //23 { QItemGroup *group = dynamic_cast<QItemGroup *>(pItem); if(group) { pCopy = group->Clone(); itemGroup->addToGroup(pCopy); } break; } default: break; } if(pCopy) { pCopy->setFlag(QGraphicsItem::ItemIsSelectable,false); } } itemGroup->setData(GROUP_NAME_KEY,data(GROUP_NAME_KEY).toString()); if(itemGroup->childItems().size() == 0) { delete itemGroup; itemGroup = NULL; } itemGroup->SaveSecurityPro(&sPro); //矩形外观 itemGroup->m_bFillColor = m_bFillColor; itemGroup->m_nFillColor = m_nFillColor; itemGroup->m_bFrameColor = m_bFrameColor; itemGroup->m_nFrameColor = m_nFrameColor; itemGroup->m_nFrameWidth = m_nFrameWidth; itemGroup->m_nAlpha = m_nAlpha; //显示区域设置 itemGroup->m_nBeginX = m_nBeginX; itemGroup->m_nBeginY = m_nBeginY; itemGroup->m_nWidth = m_nWidth; itemGroup->m_nHeight = m_nHeight; itemGroup->m_nBgColor = m_nBgColor; //位置控制 itemGroup->m_bPosCtrl = m_bPosCtrl; itemGroup->m_addrH = m_addrH; itemGroup->m_addrV = m_addrV; //大小控制 itemGroup->m_bSizeCtrl = m_bSizeCtrl; itemGroup->m_addrCircle = m_addrCircle; itemGroup->setId(id()); return itemGroup; }
dmz::QtCanvasObjectGroup * dmz::QtPluginCanvasObjectBasic::_create_item ( ObjectStruct &os, QGraphicsItem *parent, const Config &ItemList, HashTableStringTemplate<String> &table) { QtCanvasObjectGroup *group (0); if (parent) { group = new QtCanvasObjectGroup (parent); QGraphicsItem *item (0); ConfigIterator it; Config cd; Float32 z (1.0); while (ItemList.get_next_config (it, cd)) { const String DataName (cd.get_name ().to_lower ()); const String ItemName (config_to_string ("name", cd)); const Boolean Isect (config_to_boolean ("isect", cd, True)); if (DataName == "image") { item = _create_image_item (os, group, cd, table); if (Isect) { item->setData (QtCanvasObjectHandleIndex, (quint64)os.ObjHandle); } } else if (DataName == "text") { item = _create_text_item (os, group, cd); if (Isect) { item->setData (QtCanvasObjectHandleIndex, (quint64)os.ObjHandle); } } else if (DataName == "group") { item = _create_item (os, group, cd, table); } if (item) { item->setFlag (QGraphicsItem::ItemIgnoresParentOpacity, true); item->setFlag (QGraphicsItem::ItemDoesntPropagateOpacityToChildren, true); item->setZValue (z++); if (ItemName) { String name (ItemName); name << "." << os.ObjHandle; item->setData (QtCanvasObjectNameIndex, name.get_buffer ()); os.itemTable.store (ItemName, item); } } } } return group; }