Как работают итераторы QTextBlock или QTextFrame в PyQt
При работе с QTextDocument Qt предоставляет итераторы (такие как QTextBlock.iterator) для перемещения по содержимому. Документация здесь показывает код C++, но, очевидно, ++
оператор не работает, и версия PyQt, похоже, не имеет ничего подобного next()
функция.
Так как же заставить итератор повторяться?
Документация к QTextFrame.begin (которая возвращает итератор) содержит неработающую ссылку на "Итераторы стиля STL", но я не могу найти какие-либо подробности об их реализации в Python.
2 ответа
Документация показывает, что в 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
Это похоже на работу.
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
s. Я попытался добавить следующее, но, очевидно, не было кадров для итерации. Это не бросило никаких ошибок все же.
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())