染色体Item设计
染色体显示对象在界面中, 在分析视图和提取视图中需要显示. 它们都是QGraphicsItem
的派生类.
ExtractScene
中的染色体显示很简单, 在基本场景下, 只需要在分裂相的图片上面标出染色体的轮廓即可. 只有少数场景下需要显示染色体的图片(对染色体图片做了忒别的增强处理).
我们通过染色体识别, 本身就得到了染色体在图像中的轮廓, 这个信息直接被用于构建Item. 最接近的就是QGraphicsPolygonItem
. 因此,
定义类ChromosomeContourItem
, 作为QGraphicsPolygonItem
的派生类. 剩下的就是其他的一些控制信息, 比如是否显示轮廓, 轮廓的显示控制, 是否显示类别标签, 是否显示图片, 右键菜单等. 基本上没有特别需要关注的内容.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| void ChromosomeContourItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { if(isMask()) { QSize mask_size = maskSize(); QBrush brush(Qt::black, Qt::BrushStyle::SolidPattern); auto center = boundingRect().center(); QRectF mask = QRectF(QPointF(center.x()-mask_size.width()/2, center.y()-mask_size.height()/2), mask_size ); painter->fillRect(mask, brush); return; }
if((option->state & QStyle::State_Selected) || (option->state & QStyle::State_MouseOver)) { this->pen().setWidthF(lineWidth()); painter->setBrush(QBrush(QColor(0,255,0,100))); painter->setPen(this->pen()); } else { this->pen().setWidth(1); painter->setBrush(Qt::NoBrush); painter->setPen(this->pen()); } if(!this->_image.isNull() && isShowPixmap()) { int x = boundingRect().left() ; int y = boundingRect().top() ; painter->drawPixmap(QPoint(x,y), this->_image); }
if( isShowContour()) { QPen pen{this->pen()}; pen.setWidthF(lineWidth()); painter->setPen(pen); painter->drawPolygon(_drawPolygon, fillRule()); } else { painter->setPen(Qt::NoPen); painter->drawPolygon(_drawPolygon, fillRule()); } if( labelMode() == ELabelShowMode::eShowTypedLabel && isShowLabel()) { QPen pen{this->pen()}; QFont font{painter->font()}; font.setPointSize(17); painter->setFont(font); pen.setWidthF(lineWidth()); painter->setPen(pen); painter->drawText(this->boundingRect(), Qt::AlignCenter, label()); } else if (labelMode() == ELabelShowMode::eShowMarkedLabel) { auto center = boundingRect().center(); painter->setPen(Qt::NoPen); painter->setBrush(QBrush(Qt::red, Qt::BrushStyle::SolidPattern)); painter->drawEllipse(center, 10, 10); } else { } }
|