QGraphicsTextItem新增自定義下劃線

2021-10-24 11:39:33 字數 2008 閱讀 1787

qt中有原生的新增下劃線的方式(如下)但這種方式效果可能不是很好.

class ***xx: public qgraphicstextitem

;

效果如下(黃色波浪線)

我找了一下好像也不能繼承然後新增自定義的下劃線型別,所以我目前用的方法是在paint函式種繪製(有其他好辦法的話,請大神們賜教啊,拜託了)。

可以看到一是相比於原生的效果會好一點(還可以更加細緻的再去調整)二是從圓或者三角形能看出是跟著字元變化的,主要是因為我不是只用boundingbox的寬度之類的計算的。不過效果有點不好的地方在於,一是選擇文字時這些繪製的下劃線無法包含在選中文字內,有點影響觀感。二是以上圖的a為例,最右邊的圓和其上方的字母a沒有居中對齊,原因下述。

void ctextitem::paint(qpainter *painter, const qstyleoptiongraphicsitem *option, qwidget *widget)

int linecount = textlayout->linecount();

for(int i=0; ilineat(i);

if(1 == dectype)

else if(2 == dectype)

else if(3 == dectype)

else if(4 == dectype)

else if(5 == dectype)

}blockheight += textlayout->boundingrect().height() + linespace;

iterblock = iterblock.next();

}}void ctextitem::drawcircle(qtextline* textline, qpainter *painter, const int& lineindex, const int& blockheight, int radius, int spacing)

}qtextframe* rootframe = document()->rootframe();

qtextframeformat ffmt = rootframe->frameformat();

xpos += ffmt.leftmargin();

double ypos = lineindex*textline->height()+ffmt.topmargin()+blockheight;

qpointf newp(xpos,ypos);

qpainterpath outcircle = circularpath(newp,radius,0);

outpath.addpath(outcircle);

}qpen tmp_pen;

tmp_pen.setcolor(qcolor(230,0,0));

tmp_pen.setwidth(1);

painter->setpen(tmp_pen);

painter->setbrush(qt::nobrush);

painter->drawpath(outpath);

painter->setbrush(qcolor(230,0,0));

qpainterpath inpath;

for(int i=0; idrawpath(inpath);}}

主要**在於

qlistlistgr = textline->glyphruns();

for(int j=0; jpos = glr.positions();

這個就可以獲取每個字元的位置,據此可以實現下劃線根據字元的多少而變化。但同時這裡無法獲取字元的寬度,所以我是根據前後兩個位置差算寬度的,也因此最後乙個字元無法計算(上述最右邊的字母a)還請大神們賜教啊。

android自定義控制項新增自定義屬性

1 如果是自定義控制項,請在style.xml中或attrs.xml中宣告屬性 attr declare styleable 2 在theme中使用自定義的屬性,可以再多個主題中定義不同的屬性值 customize your theme here.color colorprimaryitem col...

新增自定義模板

模板 當增加一些,固定,特有組伺服器的時候,增加一些特定的監控專案,這些專案就可以加到自定義的模板裡,再將機器加到這個模板裡。每次增加類似的機器,就可以加到這個模板裡。思路 建立模板 名字自定義 模板要歸屬到模板組裡。也可以鏈結其他的模板。建立出的模板,所有的都為空。可以增加一些監控專案。可以在其他...

為C 自定義控制項新增自定義事件

大氣象 原文 為c 自定義控制項新增自定義事件 這裡的自定義控制項是由普通控制項組合而成的。希望事件響應 推遲到使用自定義控制項的窗體裡寫。步驟一 新建乙個使用者控制項,放兩個按鈕,tag分別是btn1,btn2.這兩個按鈕的共用單擊事件處理 如下 using system using system...