ExtractScene设计

染色体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());
}
// 画Pixmap
if(!this->_image.isNull() && isShowPixmap())
{
int x = boundingRect().left() /*+ this->_enlarge*/;
int y = boundingRect().top() /*+ this->_enlarge*/;
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);
//font.setBold(true);
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
{
// 不画
}
}

ExtractScene

ExtractView