のように見えます要件。
最初に取得するのは、エディタに対するカーソルの位置です。見つけたい行がある高さまたは矩形を実際に取得します。mousePressEvent
のクリック位置を返します。数字を描画するウィジェットに対して、この高さで次のアルゴリズムで位置を取得し、存在しない場合はそれを保存するか、すでに格納されている場合は削除します(hは、ウィジェット):としてそこに私たちがブロックを持って、この場合lineNumberAreaPaintEvent
には、数字を描画する方法で次に
QTextBlock block = firstVisibleBlock();
int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
int bottom = top + (int) blockBoundingRect(block).height();
int blockNumber = block.blockNumber();
while (block.isValid()) {
if (block.isVisible()) {
if(h > top && h<bottom){
int index = breakpoints.indexOf(blockNumber);
if(index != -1){
breakpoints.remove(index);
}
else
breakpoints<<blockNumber;
update();
return;
}
}
blockNumber++;
block = block.next();
top = bottom;
bottom = top + (int) blockBoundingRect(block).height();
}
それらのそれぞれのインデックスを比較し、格納されている番号の1つがペイントされているかどうかを判定します。
void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event)
{
QPainter painter(lineNumberArea);
painter.fillRect(event->rect(), Qt::lightGray);
QTextBlock block = firstVisibleBlock();
int blockNumber = block.blockNumber();
int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
int bottom = top + (int) blockBoundingRect(block).height();
while (block.isValid() && top <= event->rect().bottom()) {
if (block.isVisible() && bottom >= event->rect().top()) {
QString number = QString::number(blockNumber + 1);
//add next lines
if(breakpoints.indexOf(blockNumber) != -1){
painter.setBrush(Qt::red);
painter.drawEllipse(0, top + (fontMetrics().height()-width_circle)/2, width_circle, width_circle);
}
//end lines
painter.setPen(Qt::black);
painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
Qt::AlignRight, number);
}
block = block.next();
top = bottom;
bottom = top + (int) blockBoundingRect(block).height();
++blockNumber;
}
}
次の図は、結果を示しています。
完全な例は、以下のlinkに見出すことができます。
ありがとうございました!あなたはとても優しです:) –