Похоже, что это лучше всего сделать с помощью таблиц.Таким образом, хотя это будет запутанным, изучение структуры вложенных списков табличных данных было путь.Ключ для преобразования данных QTreeWidget проходит вдоль строк приведенных ниже кодов, так как вам нужно динамически добавлять как данные, так и стили ячеек, когда вы работаете с данными таблицы.
Предполагая, что композиция QTreeWidget - просто элементыс двумя столбцами текста (0 и 1), ниже работает.
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
pdf = SimpleDocTemplate("TreeWidgetPDF.pdf", pagesize = letter)
data = []
tStyle = []
for x in QTreeWidgetData.findItems("*", Qt.MatchWildcard, 0):
project = str(x.text(0))
data.append([project, x.text(1)])
tStyle.append(('BACKGROUND', (0, cell), (1, cell), 'YELLOW'))
tStyle.append(('FONTSIZE', (0, cell), (1, cell), 12))
cell+=1
for y in range(x.childCount()):
data.append([str(x.child(y).text(0)), str(x.child(y).text(1))])
tStyle.append(('ALIGN', (1, cell), (1, cell), 'RIGHT'))
tStyle.append(('LEFTPADDING', (0, cell), (0, cell), 15))
cell+=1
for z in range(x.child(y).childCount()):
data.append([x.child(y).child(z).text(0), x.child(y).child(z).text(1)])
tStyle.append(('ALIGN', (1, cell), (1, cell), 'RIGHT'))
tStyle.append(('LEFTPADDING', (0, cell), (0, cell), 30))
cell+=1
# And so on and so forth. You could probably iterate through this in a
# While loop so you don't have to manually nest your for statements.
parts = []
styledTable = Table(data, [6 * inch, 1 * inch, 0])
styledTable.setStyle(TableStyle(tStyle))
parts.append(table_with_style)
pdf.build(parts)