Как работают итераторы QTextBlock или QTextFrame в PyQt - PullRequest
0 голосов
/ 02 июля 2018

При работе с QTextDocument Qt предоставляет итераторы (такие как QTextBlock.iterator) для перемещения по содержимому. Документация здесь показывает код C ++, но, очевидно, оператор ++ не работает, и версия PyQt, похоже, не имеет ничего общего с next() функцией.

Так как же заставить итератор повторяться?

Документация для QTextFrame.begin (которая возвращает итератор) содержит неработающую ссылку на "Итераторы стиля STL", но я не могу найти какие-либо подробности об их реализации в Python.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Документация показывает, что в PyQt объекты итераторов поддерживают __iadd__ и __isub__. Это позволяет вам использовать, например, it += 1 вместо ++it.

Вот небольшая демонстрация:

# from PyQt5.QtWidgets import QApplication, QTextEdit
from PyQt4.QtGui import QApplication, QTextEdit

app = QApplication(['test'])

edit = QTextEdit()
edit.setText('one<b>two</b>three<br>')

it = edit.document().firstBlock().begin()
while not it.atEnd():
    fragment = it.fragment()
    if fragment.isValid():
        print(fragment.text())
    it += 1

Выход:

one
two
three
0 голосов
/ 02 июля 2018

Это похоже на работу.

textEdit = QtWidgets.QTextEdit()
for i in range(10):
    textEdit.append("Paragraph %i" % i)
doc = textEdit.document()
for blockIndex in range(doc.blockCount()):
    block = doc.findBlockByNumber(blockIndex)
    print(block.text())

К сожалению. Я не знаю о QTextFrame с. Я попытался добавить следующее, но, очевидно, не было кадров для итерации. Это не выдало никаких ошибок, хотя.

rootFrame = doc.rootFrame()
for frame in rootFrame.childFrames():
    cursor = frame.lastCursorPosition()
    print("I don't know what frames are for, but the cursor is at %i" % cursor.positionInBlock())
...