Я хочу сопоставить два указателя в объекте QMap, чтобы сохранить их отношение. Указатель ключа указывает на QTextBlock, а указатель значения указывает на виджет. Цель состоит в том, чтобы обновить позицию виджета относительно позиции QTextBlock в QPlainTextEdit, когда что-то в QPlainTextEdit изменяется. Виджет должен быть уничтожен, когда будет уничтожен QTextBlock.
Однако я не знаком с поведением QTextBlock в QPlainTextEdit. Хотя метод firstVisibleBlock() не возвращает указатель на QTextBlock в QPlainTextEdit, я создаю новый QTextBlock с QTextBlock из QPlainTextEdit в качестве параметра.
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);
}
Кажется, это работает, потому что, когда я добавляю новые строки (QTextBlocks) в QPlainTextEdit, нажимая Enter/Return, атрибуты объекта за указателем изменяются, как предполагалось. Это означает, что если вы вставите строку перед соответствующим блоком, номер блока увеличится, а геометрия/положение изменится.
Но если вы удалите соответствующую строку (backspace/del), указатель по-прежнему указывает на QTextBlock в QPlainTextEdit - я понятия не имею, как и почему. Когда я вызываю метод isValid() для значения указателя, он возвращает true.
Итак, почему атрибуты меняются, хотя это новый объект QTextBlock? Есть ли способ получить прямой указатель или ссылку на QTextBlock в QPlainTextEdit?