2017-09-20 7 views
0

みんなでコードビューを書く!qtデバッグポイント

自分のハードウェア用のカスタムデバッガを作成しようとしています。私が直面する問題は、デバッグポイントの追加機能を実現する方法がわからないことです。 詳しくは、1行に(F9)を入力し、左側の列に赤い点を付けたいと思います。または、左の列をダブルクリックし、赤い点にタグを付けます。

私はQt自身が提供しているコードエディタの例を学んだことがありますが、私のデザインを実現する方法はわかりません。

いくつかの小さなプロジェクトのほうが良いでしょう。

赤い点は、数字がQtCreatorに似ている右のスペースにクリックし、次の手順では、あなたの特定に外挿することができたときに赤い円が加算されます簡単にするために、この

答えて

1

のように見えます要件。

最初に取得するのは、エディタに対するカーソルの位置です。見つけたい行がある高さまたは矩形を実際に取得します。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; 
    } 
} 

次の図は、結果を示しています。

enter image description here

完全な例は、以下のlinkに見出すことができます。

+0

ありがとうございました!あなたはとても優しです:) –

関連する問題