QTextTable *QTextTablePrivate::createTable(QTextDocumentPrivate *pieceTable, int pos, int rows, int cols, const QTextTableFormat &tableFormat) { QTextTableFormat fmt = tableFormat; fmt.setColumns(cols); QTextTable *table = qobject_cast<QTextTable *>(pieceTable->createObject(fmt)); Q_ASSERT(table); pieceTable->beginEditBlock(); // qDebug("---> createTable: rows=%d, cols=%d at %d", rows, cols, pos); // add block after table QTextCharFormat charFmt; charFmt.setObjectIndex(table->objectIndex()); charFmt.setObjectType(QTextFormat::TableCellObject); int charIdx = pieceTable->formatCollection()->indexForFormat(charFmt); int cellIdx = pieceTable->formatCollection()->indexForFormat(QTextBlockFormat()); QTextTablePrivate *d = table->d_func(); d->blockFragmentUpdates = true; d->fragment_start = pieceTable->insertBlock(QTextBeginningOfFrame, pos, cellIdx, charIdx); d->cells.append(d->fragment_start); ++pos; for (int i = 1; i < rows*cols; ++i) { d->cells.append(pieceTable->insertBlock(QTextBeginningOfFrame, pos, cellIdx, charIdx)); // qDebug(" addCell at %d", pos); ++pos; } d->fragment_end = pieceTable->insertBlock(QTextEndOfFrame, pos, cellIdx, charIdx); // qDebug(" addEOR at %d", pos); ++pos; d->blockFragmentUpdates = false; d->dirty = true; pieceTable->endEditBlock(); return table; }