2

QMapオブジェクトに2つのポインターをマップして、それらの関係を格納したいと思います。キーポインタはQTextBlockを指し、値ポインタはウィジェットを指します。目的は、QPlainTextEditの何かが変更されたときに、QPlainTextEditのQTextBlockの位置に関連するウィジェットの位置を更新することです。QTextBlockが破棄されると、ウィジェットは破棄されます。

ただし、QPlainTextEditでのQTextBlockの動作についてはよく知りません。firstVisibleBlock()メソッドはQPlainTextEditのQTextBlockへのポインターを返さないようですが、パラメーターとしてQPlainTextEditのQTextBlockを使用して新しいQTextBlockを作成します。

QTextBlock* CodeEditor::getBlockAtPosition(QPoint position) {

  QTextBlock block = firstVisibleBlock();
  while (true)
    {
      QRectF blockDim = blockBoundingGeometry(block).translated(contentOffset());
      if (position.y() <= blockDim.bottom() && position.y() >= blockDim.top())
        {
          break;
        }
      else if (block.blockNumber() + 1 < blockCount())
        block = block.next();
      else break;
    }
  return new QTextBlock (block);
}

ポインタの背後にあるオブジェクトの属性をEnter/Returnキーを押して、QPlainTextEditに新しい行(QTextBlocks)を追加すると、意図したとおりに変更されるため、これは機能しているようです。つまり、関連するブロックの前に行を挿入すると、blockNumberが増加し、ジオメトリ/位置が変更されます。

しかし、関連する行(backspace / del)を削除しても、ポインターはQPlainTextEditのQTextBlockを指します-方法や理由はわかりません。ポインタ値でisValid()メソッドを呼び出すと、trueが返されます。

では、なぜ属性が新しいQTextBlockオブジェクトに変わるのでしょうか。QPlainTextEditでQTextBlockへの直接ポインターまたは参照を取得する方法はありますか?

4

1 に答える 1

0

これは古い質問であることは知っていますが、同様の問題の解決策を探しているときに偶然見つけたので、将来の検索に関連する可能性のある発見を文書化するために回答しています.

他の行の挿入/削除を編集する場合でも、特定の行に結び付けられるように外部マーカーを添付しようとしていました。マーカーに付いていた線を削除しても、ブロックオブジェクトが再利用されてしまい、マーカーが間違った位置に移動してしまうという問題がありました。

解決策は、テキスト ブロックのユーザー データ機能を使用することでした。ブロックが「削除」されて再利用されると、ユーザー データは削除されます。したがって、私のマーカーはから継承しQTextBlockUserData、マーカーをブロックのユーザーデータとして設定し、マーカー内のブロックへの参照を保持します。次に、有効性テストは、マーカーオブジェクトとブロックが保持するユーザーデータを比較するだけです。うまくいくようです。

于 2016-01-17T19:34:13.873 に答える