Форматирование таблицы в QTextTable

В продолжение темы Формирование ODF...: столкнулся с проблемой форматирования выводимой таблицы, как непосредственно самой таблицы, так и ячеек в ней.

Qt 5.15.12

Задача: Выводятся некоторые данные в таблице с тремя столбцами:

  1. номер по порядку
  2. название параметра
  3. значение параметра

Код формирования:

//-- попытка задать ширину столбца таблицы
QVector<QTextLength> columnLength;
QTextTableFormat tableFormat;
columnLength.append(QTextLength(QTextLength::PercentageLength, 10));
columnLength.append(QTextLength(QTextLength::PercentageLength, 20));
columnLength.append(QTextLength(QTextLength::PercentageLength, 70));
tableFormat.setColumnWidthConstraints(columnLength);

//-- формат для блоков обычных текстовых абзацев
QTextBlockFormat text_block_fmt;
text_block_fmt.setTextIndent(37.8151);         //-- в хз каких еденицах! 90 =2.38 см.
text_block_fmt.setAlignment(Qt::AlignJustify); //-- выравнивание по ширине

//-- формат для заголовков таблиц
QTextBlockFormat cellTitleBlockformat;
cellTitleBlockformat.setAlignment(Qt::AlignHCenter);

//-- формат для ячеек таблиц
QTextBlockFormat cellInfoBlockformat;
cellInfoBlockformat.setAlignment(Qt::AlignJustify);
cellInfoBlockformat.setTextIndent(18.5);
cellInfoBlockformat.setLeftMargin(4);
cellInfoBlockformat.setTopMargin(2);
cellInfoBlockformat.setBottomMargin(2);
cellInfoBlockformat.setRightMargin(6);

for (int i = 0; i < data.count(); i++) {
    int table_num = i + 1;
    //-- указываем
    progress->setLabelText(QString("Формируемый элемент: %1").arg(table_num));
    qApp->processEvents();

    QString corrected_name = data[i]->name.trimmed();
    QString title =
        QString("Таблица %1 - ..... %2\n")
            .arg(QString::number(table_num), corrected_name);
    cursor.setBlockFormat(text_block_fmt);
    cursor.setBlockCharFormat(fmt_title);
    cursor.insertText(title, fmt_title);

    //-- 3 столбца с 20 строками (первая строка - заголовок таблицы)
    //-- указатель на формируемую таблицу

    QTextTable *tbl = cursor.insertTable(20, 3, tableFormat);
    cnt = 0;
    //-- формируем заголовки таблицы
    //------------------------------------------------------------------------------------------------
     QTextCursor tblCursor = tbl->cellAt(cnt, 0).firstCursorPosition();
    tblCursor.setBlockFormat(cellTitleBlockformat);
    tblCursor.insertText("№ п/п", fmt_table_caption);

    tblCursor = tbl->cellAt(cnt, 1).firstCursorPosition();
    tblCursor.setBlockFormat(cellTitleBlockformat);
    tbl->cellAt(cnt, 1).firstCursorPosition().insertText("Наименование поля ",
                                                         fmt_table_caption);

    tblCursor = tbl->cellAt(cnt, 2).firstCursorPosition();
    tblCursor.setBlockFormat(cellTitleBlockformat);
    tbl->cellAt(cnt++, 2).firstCursorPosition().insertText("Значение поля", fmt_table_caption);

    //-- теперь заполняем данные
    //------------------------------------------------------------------------------------------------
    tblCursor = tbl->cellAt(cnt, 0).firstCursorPosition();
    tblCursor.setBlockFormat(cellTitleBlockformat);
    tbl->cellAt(cnt, 0).firstCursorPosition().insertText(QString::number(cnt), fmt_table_text);
    tblCursor = tbl->cellAt(cnt, 1).firstCursorPosition();
    tblCursor.setBlockFormat(cellInfoBlockformat);
    tbl->cellAt(cnt, 1).firstCursorPosition().insertText("Параметр", fmt_table_text);
    tblCursor = tbl->cellAt(cnt, 2).firstCursorPosition();
    tblCursor.setBlockFormat(cellInfoBlockformat);
    tbl->cellAt(cnt++, 2).firstCursorPosition().insertText(
        data[i]->vul_name.isEmpty() ? strNoInfo : data[i]->name, fmt_table_text);

... заполнение строк таблицы и в конце попытка снова задания формата

    tableFormat = tbl->format();
    tableFormat.setColumnWidthConstraints(columnLength);
    tbl->setFormat(tableFormat);

Проблема 1: Ни первая попытка задания формата таблицы при вставке ни вторая по окончании создания таблицы никакого эффекта не дают.

Проблема 2: Не могу вставить текст в ячейку таблицы, если он содержит символы переноса строки "\n". Строки после первой просто пропадают. Временно решил проблему вставкой не текста а HTML, примерно так:

    auto link = data[i]->link;
    link = link.replace("\n", "<br>");
    link = link.replace("\r", "");
    link = link.replace(QRegularExpression("(<br>){2,}"), "<br>");
    link = QString("<span style=\" font-size:12pt; font-family:Times New Roman;\">%1</span>").arg(link);
    tbl->cellAt(cnt++, 2).firstCursorPosition().insertHtml(
        data[i]->link.isEmpty() ? "-" : link);

Но это очень... коряво.

Кто может подсказать, направить и ткнуть носом в ошибку?


Ответы (0 шт):