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への直接ポインターまたは参照を取得する方法はありますか?