/*! * \file AwesomeImgViewer.cpp * \date 2018/06/26 * * \author Lin, Chi * Contact: lin.chi@hzleaper.com * * * \note */ #include "AwesomeImgViewer.h" #include "AwesomeRoi.h" #include "qtUtils.h" #include #include #include AwesomeImgViewer::AwesomeImgViewer(QWidget* parent) : lpImgViewer(parent), mOpState(Reserved), mRoiCounter(0), mRestrictMode(false), mHasImg(false), mpMaskImgItem(nullptr), mpMaskImg(nullptr) { setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setRenderHint(QPainter::HighQualityAntialiasing); } QGraphicsPixmapItem* AwesomeImgViewer::setImg(QImage& img) { QGraphicsPixmapItem* ret = lpImgViewer::setImg(img); mHasImg = true; mpImgItem->setFlag(QGraphicsItem::ItemIsMovable, true); refreshSenseRng(); // refresh restrict area if (mRestrictMode) { for(QMap::iterator it = mMapRoiItems.begin();it!=mMapRoiItems.end();++it) { (*it)->setRestricArea(mpImgItem->boundingRect().adjusted(1, 1, -1, -1)); } } return ret; } QGraphicsPixmapItem* AwesomeImgViewer::setMaskImg(QImage& maskImg) { if (mpMaskImg) delete mpMaskImg; mpMaskImg = new QImage(maskImg); if (!mpMaskImgItem) mpMaskImgItem = scene()->addPixmap(QPixmap::fromImage(maskImg, Qt::NoFormatConversion)); else mpMaskImgItem->setPixmap(QPixmap::fromImage(maskImg, Qt::NoFormatConversion)); mpMaskImgItem->setParentItem(mpImgItem); mpMaskImgItem->setOffset(mpImgItem->offset()); return mpMaskImgItem; } void AwesomeImgViewer::addRectRoi( const QPointF& pos, const QSizeF& size, double angle, const QString& label, const QColor& color, const QColor& activeColor) { QPointF offset = mpImgItem ? mpImgItem->offset() : QPointF(); AwesomeRectRoi* rectRoi = new AwesomeRectRoi(&mCommonProps, QSizeF(abs(size.width()), abs(size.height())), mpImgItem); if (size.width() < 0 || size.height() < 0) rectRoi->setRoiSift(true); rectRoi->setPos(pos + offset); addRoiCommon(rectRoi, label, color, activeColor); rectRoi->getGraphicsItem()->setRotation(angle); // should be the last one //rectRoi->setRoiPicked(false); } void AwesomeImgViewer::addAffineRoi(const QPointF& tl, const QPointF& tr, const QPointF& br, const QPointF& bl, const QString& label, const QColor& color, const QColor& activeColor) { AffineRect ar = {tl, tr, br, bl}; AwesomeAffineRoi* affineRoi = new AwesomeAffineRoi(&mCommonProps, ar, mpImgItem); addRoiCommon(affineRoi, label, color, activeColor); } void AwesomeImgViewer::addPointRoi(const QPointF& pos, double r, double angle, const QString& label, const QColor& color, const QColor& activeColor) { AwesomePointRoi* pointRoi = new AwesomePointRoi(&mCommonProps, abs(r), mpImgItem); if (r < 0) pointRoi->setRoiSift(true); pointRoi->setPos(pos); if (angle != DBL_MAX) pointRoi->setAngle(angle); addRoiCommon(pointRoi, label, color, activeColor); } void AwesomeImgViewer::mousePressEvent(QMouseEvent* e) { setCursor(Qt::PointingHandCursor); { if (mOpState == Reserved && mHasImg) { QPoint curpos = (mpImgItem->mapFromScene(this->mapToScene(e->pos())) + QPointF(mImgOriSize.width() / 2.0, mImgOriSize.height() / 2.0) + QPointF(-0.5, -0.5)).toPoint(); if (curpos.x() >= 0 && curpos.x() < mImgOriSize.width() && curpos.y() >= 0 && curpos.y() < mImgOriSize.height()) { // report pixel clicked when it's inside the image emit pixelClicked(curpos); } } } if (mOpState == Prepared) { addMousePos2AddingPnt(e, 0); mOpState = Adding; clearSelection(); } else if (mOpState == Picking && mHasImg) { QPoint curpos = (mpImgItem->mapFromScene(this->mapToScene(e->pos())) + QPointF(mImgOriSize.width() / 2.0, mImgOriSize.height() / 2.0) + QPointF(-0.5, -0.5)).toPoint(); if (curpos.x() >= 0 && curpos.x() < mImgOriSize.width() && curpos.y() >= 0 && curpos.y() < mImgOriSize.height()) { // report pixel clicked when it's inside the image emit pixelClicked(curpos); } } else { // clear selection if click on empty place QPointF mpos = getMousePos(e); bool doClear = true; for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { QGraphicsItem* pItem = (*roiItem)->getGraphicsItem(); if ((*roiItem)->senseRect().contains(pItem->mapFromParent(mpos))) { doClear = false; if (mCommonProps.siftMode) { setCursor(Qt::PointingHandCursor); mCommonProps.isSifting = (*roiItem)->isRoiPicked() ? -1 : 1; (*roiItem)->setRoiPicked(!(*roiItem)->isRoiPicked()); } break; } } if (doClear) clearSelection(); lpImgViewer::mousePressEvent(e); } } void AwesomeImgViewer::mouseMoveEvent(QMouseEvent* e) { if (mOpState == Adding) { addMousePos2AddingPnt(e, 1); } else if (mCommonProps.isSifting != 0) { QPointF mpos = getMousePos(e); bool doPicked = mCommonProps.isSifting > 0; for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { QGraphicsItem* gItem = (*roiItem)->getGraphicsItem(); if ((*roiItem)->isRoiPicked() != doPicked && gItem->boundingRect().contains(gItem->mapFromParent(mpos))) { (*roiItem)->setRoiPicked(doPicked); } } } else { lpImgViewer::mouseMoveEvent(e); } } void AwesomeImgViewer::mouseReleaseEvent(QMouseEvent* e) { if (mOpState == Adding) { addMousePos2AddingPnt(e, 1); if (mAddingType == AwsRoiRect) addRectRoi((mAddingPnts[0] + mAddingPnts[1]) / 2, QSizeF(abs(mAddingPnts[0].x() - mAddingPnts[1].x()), abs(mAddingPnts[0].y() - mAddingPnts[1].y()))); else if (mAddingType == AwsRoiAffine) { qreal l = std::min(mAddingPnts[0].x(), mAddingPnts[1].x()); qreal r = std::max(mAddingPnts[0].x(), mAddingPnts[1].x()); qreal t = std::min(mAddingPnts[0].y(), mAddingPnts[1].y()); qreal b = std::max(mAddingPnts[0].y(), mAddingPnts[1].y()); addAffineRoi(QPointF(l, t), QPointF(r, t), QPointF(r, b), QPointF(l, b)); } else if (mAddingType == AwsRoiPoint) { QPointF away = getMousePos(e) - mAddingPnts.front(); if (abs(away.x()) + abs(away.y()) < 4) { addPointRoi(mAddingPnts.front(), 2); } } resetAdding(); } else if (mCommonProps.isSifting != 0) { setCursor(Qt::ArrowCursor); mCommonProps.isSifting = 0; } else if (mOpState != Picking) { setIsAddingRoi(false); } lpImgViewer::mouseReleaseEvent(e); } void AwesomeImgViewer::wheelEvent(QWheelEvent* e) { lpImgViewer::wheelEvent(e); refreshSenseRng(); } void AwesomeImgViewer::keyPressEvent(QKeyEvent* e) { if (e->key() == Qt::Key_A && e->modifiers() == Qt::ControlModifier) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { (*roiItem)->setRoiPicked(true); } } else if (e->key() == Qt::Key_Delete) { onBtnDeleteClicked(); } else if (e->key() == Qt::Key_Insert) { } else if (e->key() == Qt::Key_Escape && mOpState != Reserved) { resetAdding(); } else { lpImgViewer::keyPressEvent(e); } } void AwesomeImgViewer::getAllRoiVertex(QVector& allRoiInfo) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { AwesomeRoiInfo* pRoiInfo = allRoiInfo.insert(allRoiInfo.end(), AwesomeRoiInfo()); getRoiInfo((*roiItem), *pRoiInfo); } } void AwesomeImgViewer::getDetectVertex(AwesomeRoiInfo& detectRoiInfo) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { if ((*roiItem)->objectName().contains("Detect")) { getRoiInfo((*roiItem), detectRoiInfo); break; } } } void AwesomeImgViewer::getAllFilterVertex(QList& allFilterRoiInfo) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { if ((*roiItem)->objectName().contains("Detect")) continue; AwesomeRoiInfo roiInfo; getRoiInfo((*roiItem), roiInfo); allFilterRoiInfo.append(roiInfo); } } QMap> AwesomeImgViewer::getAllFilterVectorMap() { QMap> rlt; for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { QString strID = (*roiItem)->objectName(); if (strID.contains("Detect")) continue; AwesomeRoiInfo roiInfo; getRoiInfo((*roiItem), roiInfo); QVector polygon; for (int i = 0; i < roiInfo.vertex.size(); i++) { polygon.append(roiInfo.vertex.at(i).toPoint()); } rlt.insert(strID, polygon); } return rlt; } QStringList AwesomeImgViewer::getAllSiftRois() const { QStringList allSiftRoiNames; // foreach(AwesomeRoiBase* roiItem, mRoiItems) { // if (roiItem->isRoiSift()) { // allSiftRoiNames.append(roiItem->getLabel()); // } // } return allSiftRoiNames; } void AwesomeImgViewer::enableSingleDetectRoi(bool enable, const QPointF& centerpos, const QSizeF& size, qreal angle, const QString& label) { enableSingleMode(enable);//清除所有ROI if (enable) { if (centerpos.isNull() || size.isEmpty()) { QPixmap img = mpImgItem->pixmap(); int w = std::max(std::max(100, img.width() / 5), std::max(100, img.height() / 5)); addRectRoi(QPointF(w / 2. - 1, w / 2. - 1), QSizeF(w, w), angle, label, QColor(0, 200,0), QColor(0, 200, 111)); } else { addRectRoi(centerpos, size, angle, label, QColor(0, 200, 0), QColor(0, 200, 111)); } } m_detectRoiAngle = angle; } void AwesomeImgViewer::enableSingleAffineRoiMode(bool enable, const QPointF& tl, const QPointF& tr, const QPointF& br, const QPointF& bl, const QString& label) { enableSingleMode(enable); if (enable) { QPixmap img = mpImgItem->pixmap(); qreal x = img.width() / 2., y = img.height() / 2.; addAffineRoi(tl.isNull() ? QPointF(-x, -y) : tl, tr.isNull() ? QPointF(x, -y) : tr, br.isNull() ? QPointF(x, y) : br, bl.isNull() ? QPointF(-x, y) : bl, label); } } void AwesomeImgViewer::changeRoiRect(const QPointF& pos /*= QPointF()*/, const QSizeF& size /*= QSizeF()*/, const QString& label /*= ""*/) { for (QMap::iterator it = mMapRoiItems.begin(); it != mMapRoiItems.end(); ++it) { if (it.key().contains("Detect")) { ((AwesomeRectRoi*)*it)->setPos(pos); ((AwesomeRectRoi*)*it)->setRealRect(QRectF(-size.width() / 2, -size.height() / 2, size.width(), size.height())); break; } } } void AwesomeImgViewer::changeFilterRoiRect(const QPointF& pos /*= QPointF()*/, const QSizeF& size /*= QSizeF()*/, const QString& strName /*= ""*/) { for (QMap::iterator it = mMapRoiItems.begin(); it != mMapRoiItems.end(); ++it) { if (it.key() == strName) { ((AwesomeRectRoi*)*it)->setPos(pos); ((AwesomeRectRoi*)*it)->setRealRect(QRectF(-size.width() / 2, -size.height() / 2, size.width(), size.height())); break; } } } QStringList AwesomeImgViewer::getAllFilterNames() { QStringList filterNames; for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { QString strObjName = (*roiItem)->objectName(); if (strObjName.contains("Detect")) continue; filterNames.append(strObjName); } return filterNames; } void AwesomeImgViewer::setFilterROISelect(QString strName) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { QString strN = (*roiItem)->objectName(); if(strName == strN) (*roiItem)->setRoiPicked(true); else (*roiItem)->setRoiPicked(false); } } void AwesomeImgViewer::changeRoiRectAngle(qreal angle /*= 0*/, const QString& label /*= ""*/) { for (QMap::iterator it = mMapRoiItems.begin(); it != mMapRoiItems.end(); ++it) { if (it.key().contains("Detect")) { ((AwesomeRectRoi*)*it)->getGraphicsItem()->setRotation(angle); m_detectRoiAngle = angle; } else { ((AwesomeRectRoi*)*it)->getGraphicsItem()->setRotation(angle); } } } void AwesomeImgViewer::enableSiftMode(bool enable) { mCommonProps.siftMode = enable; if (mCommonProps.siftMode) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { (*roiItem)->getGraphicsItem()->setFlag(QGraphicsItem::ItemIsMovable, false); } } } void AwesomeImgViewer::enablePickMode(bool enable) { if (!mHasImg) return; if (enable) { mpImgItem->setFlag(QGraphicsItem::ItemIsMovable, false); static QPixmap pipettePixmap(":/cursor_pipette.png"); setCursor(QCursor(pipettePixmap, 4, 26)); mOpState = OpState::Picking; } else { mpImgItem->setFlag(QGraphicsItem::ItemIsMovable, true); setCursor(Qt::ArrowCursor); mOpState = OpState::Reserved; } } void AwesomeImgViewer::setLabelVisible(bool visible) { if (visible) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { (*roiItem)->showLabel(); } } else { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { (*roiItem)->hideLabel(); } } } void AwesomeImgViewer::enableRoiCtrl(bool enable, const QList& enableRoiTypes) { // ui->wgtRoiCtrl->setVisible(enable); // mpCtrlBar->adjustSize(); // if (enableRoiTypes.size() > 0) { // int c = ui->comboRoiType->count(); // for (int i = c - 1; i >= 0; --i) { // int t = ui->comboRoiType->itemData(i).toInt(); // if (enableRoiTypes.indexOf(static_cast(t)) < 0) { // ui->comboRoiType->removeItem(i); // } // } // } } void AwesomeImgViewer::clear() { lpImgViewer::clear(); mMapRoiItems.clear(); mAddingPnts.clear(); mAddingType = AwsRoiReserved; // set null image to init the root image item QImage img_root = QImage(":/imagena.png"); setImg(img_root); mpAddingPath = new QGraphicsPathItem(mpImgItem); mpAddingPath->setPen(QPen(QColor(20, 20, 20), 1, Qt::DashLine)); mHasImg = false; mpImgItem->setFlag(QGraphicsItem::ItemIsMovable, false); // disable moving placeholder image mpMaskImgItem = nullptr; if (mpMaskImg) { delete mpMaskImg; mpMaskImg = nullptr; } } void AwesomeImgViewer::onResetView() { scaleImg2(1.0); setIsAutoResetTransform(true); } void AwesomeImgViewer::onSetScale(qreal val) { scaleImg2(1.0); } void AwesomeImgViewer::onClearAllROI() { enableSingleMode(true); } void AwesomeImgViewer::onAddFilterROI(const QPointF& pos /*= QPointF()*/, const QSizeF& size /*= QSizeF()*/, qreal angle /*= 0*/, const QString& label /*= ""*/) { angle = m_detectRoiAngle; if (pos.isNull() || size.isEmpty()) { QPixmap img = mpImgItem->pixmap(); int w = std::min(std::max(50, img.width()), std::max(50, img.height())); addRectRoi(QPointF(w / 2. - 1, w / 2. - 1), QSizeF(w, w), angle, label, QColor(230, 200, 0), QColor(230, 200, 111)); } else { addRectRoi(pos, size, angle, label, QColor(230, 200, 0), QColor(230, 200, 111)); } } void AwesomeImgViewer::onClearFilterROIs(const QString& label /*= "Filter"*/) { QStringList lstName; for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { QString strName = (*roiItem)->objectName(); if (!strName.contains("Filter")) continue; scene()->removeItem((*roiItem)->getGraphicsItem()); delete (*roiItem); lstName.append(strName); } foreach(QString var, lstName) { mMapRoiItems.remove(var); } } void AwesomeImgViewer::onBtnAddClicked(bool isChecked) { // no add op in single roi mode if (mCommonProps.singleRoiMode) return; if (mCommonProps.siftMode) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { if ((*roiItem)->isRoiPicked()) { (*roiItem)->setRoiSift(false); (*roiItem)->setRoiPicked(false); // un-pick (*roiItem)->setRoiActive(false); // un-active } } } else { // mAddingType = static_cast(ui->comboRoiType->currentData().toInt()); // if (mAddingType <= AwsRoiReserved || mAddingType >= AwsRoiLast) return; // setIsAddingRoi(isChecked); } } void AwesomeImgViewer::onBtnDeleteClicked() { // no delete op in single roi mode // if (mCommonProps.singleRoiMode || mCommonProps.siftMode) return; // // for (int i = mRoiItems.size() - 1; i >= 0; i--) { // AwesomeRoiBase* roiItem = mRoiItems[i]; // if (roiItem->isRoiPicked()) { // mRoiItems.remove(i); // scene()->removeItem(roiItem->getGraphicsItem()); // delete roiItem; // } // } // unsetCursor(); } void AwesomeImgViewer::onBtnSubClicked(bool isChecked) { // no add op in single roi mode // if (mCommonProps.singleRoiMode) return; // // if (mCommonProps.siftMode) { // foreach(AwesomeRoiBase* roiItem, mRoiItems) { // if (roiItem->isRoiPicked()) { // roiItem->setRoiSift(true); // roiItem->setRoiPicked(false); // un-pick // roiItem->setRoiActive(false); // un-active // } // } // } } void AwesomeImgViewer::onBtnHideRoiPressed() { // hide all roi for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { (*roiItem)->getGraphicsItem()->hide(); } } void AwesomeImgViewer::onBtnHideRoiReleased() { // show all roi for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { (*roiItem)->getGraphicsItem()->show(); } } void AwesomeImgViewer::onRoiSelected(bool isSelected) { if (isSelected && mCommonProps.isSifting == 0) { Qt::KeyboardModifiers k = QApplication::queryKeyboardModifiers(); if (!k.testFlag(Qt::ShiftModifier) && !k.testFlag(Qt::ControlModifier)) { // not multi-select, clear other selection clearSelection(sender()); } } } void AwesomeImgViewer::onRoiChanged() { AwesomeRoiInfo roiInfo; AwesomeRoiBase* roiItem = qobject_cast(sender()); if (roiItem&&roiItem->objectName().contains("Detect")) { getRoiInfo(roiItem, roiInfo); emit roiChanged(roiInfo); } else { getRoiInfo(roiItem, roiInfo); QString strObj = roiItem->objectName(); emit filterroiChanged(roiInfo, strObj); } } void AwesomeImgViewer::onRoiLockIng() { AwesomeRoiBase* roiItem = qobject_cast(sender()); QString strName = roiItem->objectName(); emit roiLockIng(strName); } void AwesomeImgViewer::addRoiCommon( AwesomeRoiBase* roiItem, const QString& label, const QColor& color, const QColor& activeColor ) { if (color.isValid()) roiItem->setNormalColor(color); else if (mDefaultColor.isValid()) roiItem->setNormalColor(mDefaultColor); if (activeColor.isValid()) roiItem->setActiveColor(activeColor); else if (mDefaultActiveColor.isValid()) roiItem->setActiveColor(mDefaultActiveColor); mRoiCounter++; if (label.isNull()) roiItem->setLabel(QString::number(mRoiCounter)); else roiItem->setLabel(label); QString strObjname = QString("%1").arg(label); roiItem->setObjectName(strObjname); if (mRestrictMode) roiItem->setRestricArea(mpImgItem->boundingRect().adjusted(1, 1, -1, -1)); connect(roiItem, SIGNAL(toggledPick(bool)), this, SLOT(onRoiSelected(bool))); connect(roiItem, SIGNAL(roiChanged()), this, SLOT(onRoiChanged())); connect(roiItem, SIGNAL(roiLockIng()), this, SLOT(onRoiLockIng())); mMapRoiItems.insert(strObjname, roiItem); } void AwesomeImgViewer::setIsAddingRoi(bool isAddingRoi) { mOpState = isAddingRoi ? Prepared : Reserved; if (isAddingRoi) { setCursor(Qt::CrossCursor); for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { QGraphicsItem* gItem = (*roiItem)->getGraphicsItem(); gItem->setEnabled(false); } } else { setCursor(Qt::ArrowCursor); for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { QGraphicsItem* gItem = (*roiItem)->getGraphicsItem(); gItem->setEnabled(true); } } } QPointF AwesomeImgViewer::getMousePos(QMouseEvent* e) { if (mpImgItem) return mpImgItem->mapFromScene(this->mapToScene(e->pos())); return QPointF(); } void AwesomeImgViewer::addMousePos2AddingPnt(QMouseEvent* e, int idx) { if (mAddingPnts.size() <= idx || idx == -1) mAddingPnts.append(getMousePos(e)); else mAddingPnts[idx] = getMousePos(e); updateAddingPath(); } void AwesomeImgViewer::updateAddingPath() { if (mAddingPnts.size() == 0) mpAddingPath->setPath(QPainterPath()); else { QPainterPath p; if ((mAddingType == AwsRoiRect || mAddingType == AwsRoiAffine) && mAddingPnts.size() >= 2) { p.addRect(std::min(mAddingPnts[0].x(), mAddingPnts[1].x()), std::min(mAddingPnts[0].y(), mAddingPnts[1].y()), abs(mAddingPnts[0].x() - mAddingPnts[1].x()), abs(mAddingPnts[0].y() - mAddingPnts[1].y())); } else if (mAddingType == AwsRoiPoint && mAddingPnts.size() >= 1) { p.addEllipse(mAddingPnts.front(), 2, 2); } mpAddingPath->setPath(p); } } void AwesomeImgViewer::resetAdding() { mOpState = Reserved; mAddingPnts.clear(); updateAddingPath(); } void AwesomeImgViewer::clearSelection(QObject* excludeObj) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { if ((*roiItem) != excludeObj) (*roiItem)->setRoiPicked(false); } } void AwesomeImgViewer::getRoiOnImg(AwesomeRoiBase* roiItem, QList& roiOnImg) { const QList& pnts = roiItem->getVertex(); QGraphicsItem* gItem = roiItem->getGraphicsItem(); foreach(const QPointF& pnt, pnts) { roiOnImg.append(gItem->mapToParent(pnt) - mpImgItem->offset()); // roi item's parent is the image. } } void AwesomeImgViewer::getRoiInfo(AwesomeRoiBase* roiItem, AwesomeRoiInfo& roiInfo) { roiInfo.type = roiItem->getRoiType(); roiInfo.label = roiItem->getLabel(); getRoiOnImg(roiItem, roiInfo.vertex); } void AwesomeImgViewer::enableSingleMode(bool enable) { mCommonProps.singleRoiMode = enable; if (enable) { // delete all roi for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { scene()->removeItem((*roiItem)->getGraphicsItem()); delete (*roiItem); } mMapRoiItems.clear(); } } float AwesomeImgViewer::getSenseRng() { QPointF a = mapToScene(QPoint(0, 15)); QPointF b = mapToScene(QPoint(0, 0)); return abs(a.y() - b.y()); } void AwesomeImgViewer::refreshSenseRng() { if (mpImgItem) { mCommonProps.senseRng = getSenseRng(); mCommonProps.labelFont = QApplication::font(); QFontMetricsF metrics(mCommonProps.labelFont); float factor = (mCommonProps.senseRng - 0.5) / metrics.height(); mCommonProps.labelFont.setPointSizeF(mCommonProps.labelFont.pointSizeF() * factor); for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { (*roiItem)->updateSenseRng(); } } } void AwesomeImgViewer::setLockAll(bool bLock) { for (QMap::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem) { (*roiItem)->onSetLock(bLock); } }