Получить указатель на QTextBlock в QPlainTextEdit - PullRequest
2 голосов
/ 01 декабря 2011

Я хочу отобразить два указателя в объекте QMap, чтобы сохранить их отношение.Указатель ключа указывает на QTextBlock, а указатель значения указывает на виджет.Цель состоит в том, чтобы обновить позицию виджета относительно позиции QTextBlock в QPlainTextEdit, когда что-то в QPlainTextEdit изменяется.Виджет должен быть уничтожен при уничтожении QTextBlock.

Однако я не знаком с поведением QTextBlock в QPlainTextEdit.Хотя метод firstVisibleBlock (), кажется, не возвращает указатель на QTextBlock в QPlainTextEdit, я создаю новый QTextBlock с QTextBlock из QPlainTextEdit в качестве параметра.Я добавляю новые строки (QTextBlocks) в QPlainTextEdit, нажимая Enter / Return атрибуты объекта за изменением указателя, как и предполагалось.Это означает, что если вы вставите строку перед соответствующим блоком, blockNumber увеличится, а геометрия / позиция изменится.

Но если вы удалите соответствующую строку (backspace / del), указатель по-прежнему будет указывать на QTextBlock в QPlainTextEdit- Понятия не имею, как и почему.Когда я вызываю метод isValid () для значения указателя, он возвращает true.

Итак, почему атрибуты меняются, если это новый объект QTextBlock?Есть ли способ получить прямой указатель или ссылку на QTextBlock в QPlainTextEdit?

1 Ответ

0 голосов
/ 17 января 2016

Я знаю, что это старый вопрос, но я наткнулся на него, ища решение аналогичной проблемы, поэтому я отвечаю на документ, который я нашел, который может иметь отношение к будущим поискам.

Я пытался прикрепить некоторый внешний маркер, который будет привязан к определенной строке, даже при редактировании вставляет / удаляет другие строки.Проблема заключалась в том, что даже если строка, прикрепленная к маркеру, была удалена, объект блока использовался повторно, и поэтому маркер перемещался в неправильную позицию.

Решением было использование функции пользовательских данных текстового блока.Когда блок «удаляется» и используется повторно, пользовательские данные удаляются.Таким образом, мой маркер наследуется от QTextBlockUserData, и я устанавливаю маркер в качестве пользовательских данных для блока и сохраняю ссылку на блок в маркере.Затем проверка достоверности состоит в том, чтобы просто сравнить маркерный объект и пользовательские данные, хранящиеся в блоке.Кажется, работает.

...