Russian Qt Forum
Ноябрь 01, 2024, 08:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Голосование
Вопрос: Не удаётся задать для QTextTable столбцы разной ширины.
Возможно реализовать.
Применить "костыль".

Страниц: [1]   Вниз
  Печать  
Автор Тема: Столбцы индивидуальной ширины в QTextTable  (Прочитано 7090 раз)
Pupil
Гость
« : Март 11, 2013, 08:39 »

Приветствую всех!

При перепробовании возможных вариантов задания для QTextTable столбцов разной ширины (и гуглил и книжил) так и не удалось реализовать данную задачу. Пишу на Qt 4.8.

"Костыльный" вариант есть, но до него опускаться не хочется. )

Кто-нибудь сталкивался с данным вопросом? )


Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Март 11, 2013, 09:32 »

Ссылка на букварь. Особенно смотреть последний абзац в детальном описании. Индивидуальной ширины можно добиваться через QTextLength::FixedLength
« Последнее редактирование: Март 11, 2013, 09:35 от Hellraiser » Записан
Pupil
Гость
« Ответ #2 : Март 11, 2013, 09:51 »

Пробовал через QTextLength - не работает. )
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #3 : Март 11, 2013, 09:55 »

Без какого-либо конкретного кода даже бессмысленно обсуждать. Или вы считаете, что разработчики Qt просто так пишут "всякие не работающие глупости" в букварь?
Записан
Pupil
Гость
« Ответ #4 : Март 11, 2013, 10:53 »

Код:

Код:
void SaveForm::saveAs(const QString &file)
{
    int rowsCount = ui->logView->model()->rowCount();
    QTextDocument doc;
    QTextCursor cursor(&doc);
    QTextBlockFormat blockFormat;

    blockFormat.setAlignment(Qt::AlignHCenter);
    cursor.insertBlock(blockFormat);
    cursor.insertText("Архив "
                      + ui->startDateTimeEdit->dateTime().toString("dd.MM.yyyy")
                      + " по " +ui->finishDateTimeEdit->dateTime().toString("dd.MM.yyyy") + "\n");

    cursor.movePosition(QTextCursor::End);

    //Формируем таблицу
    QTextTable *table;
    if (rowsCount != 0) {


        QVector<QTextLength> columnLength;
        columnLength.append(QTextLength(QTextLength::PercentageLength, 1));
        columnLength.append(QTextLength());
        columnLength.append(QTextLength());
        columnLength.append(QTextLength());
        columnLength.append(QTextLength(QTextLength::PercentageLength, 10));
        columnLength.append(QTextLength());

        QTextTableFormat tableFormat;
        tableFormat.setColumnWidthConstraints(columnLength);
        tableFormat.setBorder(1);
        table = cursor.insertTable(rowsCount+1, 6, tableFormat);

        //Формируем заголовок
        QStringList headers;
        headers << "Заголовок1" << " Заголовок2" << " Заголовок3" << " Заголовок4" << " Заголовок5" << " Заголовок6";
        for (int i = 0; i<6; ++i) {
            QTextCursor cellCursor = table->cellAt(0, i).firstCursorPosition();
            cellCursor.setBlockFormat(blockFormat);
            cellCursor.insertText(headers[i]);
        }

        //Поля
        for (int row = 0; row < rowsCount; ++row) {
            QTextCursor counterCellCursor = table->cellAt(row+1, 0).firstCursorPosition();
            counterCellCursor.setBlockFormat(blockFormat);
            counterCellCursor.insertText(QString().number(row+1));

            for (int col = 1; col < 6; ++col) {
                QVariant cellData = getCellData(row, col-1);
                qDebug() << cellData.toString();
                QTextCursor cellCursor = table->cellAt(row+1, col).firstCursorPosition();

                cellCursor.setBlockFormat(blockFormat);
                if (col != 1)
                    cellCursor.insertText(cellData.toString());
                else
                    cellCursor.insertText(cellData.toDateTime().toString("h:mm  dd.MM.yyyy"));
            }
        }
    } else {
        //Если данных нет
        table = cursor.insertTable(1, 1);
        QTextCursor cellCursor = table->cellAt(0, 0).firstCursorPosition();
        cellCursor.insertText(tr("Нет данных, проверьте условия отсева"));
    }

    cursor.movePosition(QTextCursor::End);

    blockFormat.setAlignment(Qt::AlignLeft);
    cursor.insertBlock(blockFormat);
    QString tmpOperator = (currentName.isEmpty())?"--":currentName;
    cursor.insertText("Дата время выборки: " + QDateTime::currentDateTime().toString("h:mm  dd.MM.yyyy") + "\n"
                      + "Прораб: " + tmpOperator);
   
    QTextDocumentWriter writer(file, "odf");
    writer.write(&doc);
}
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #5 : Март 11, 2013, 11:05 »

Ну и к чему мне этот некомпилируемый пример? Вот тестовый кусок, который работает:
Код
C++ (Qt)
#include <QApplication>
#include <QTextEdit>
#include <QTextDocument>
#include <QTextCursor>
#include <QVector>
#include <QTextLength>
#include <QTextTableFormat>
 
int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  QTextEdit tx;
  QTextDocument doc;
  tx.setDocument(&doc);
  QTextCursor cursor(&doc);
  QVector<QTextLength> tl;
  tl.append(QTextLength(QTextLength::PercentageLength, 10));
  tl.append(QTextLength(QTextLength::PercentageLength, 20));
  tl.append(QTextLength(QTextLength::PercentageLength, 40));
  tl.append(QTextLength(QTextLength::PercentageLength, 30));
  QTextTableFormat fmt;
  fmt.setColumnWidthConstraints(tl);
  cursor.insertTable(3, 4, fmt);
  tx.show();
  return app.exec();
}
Записан
Pupil
Гость
« Ответ #6 : Март 11, 2013, 12:53 »

Данные берутся из базы.
Проверил - при моём варианте забивания данных - не работает.
Как были столбцы одинаковой ширины - так и остались. )
Записан
Pupil
Гость
« Ответ #7 : Март 11, 2013, 13:24 »

Походу пьесы всё дело в библиотеке Libra Офиса. Возможности пятикантропного форматирования...
Записан
Pupil
Гость
« Ответ #8 : Март 11, 2013, 13:33 »

Данный код выдаёт одинаовую ширину всех столбцов:

Код:
QTextTable *table;

    QVector<QTextLength> columnLength;
    QTextTableFormat tableFormat;

     columnLength.append(QTextLength(QTextLength::PercentageLength, 1));
     columnLength.append(QTextLength(QTextLength::PercentageLength, 5));
     columnLength.append(QTextLength(QTextLength::PercentageLength, 10));
     columnLength.append(QTextLength(QTextLength::PercentageLength, 15));
     columnLength.append(QTextLength(QTextLength::PercentageLength, 20));
     columnLength.append(QTextLength(QTextLength::PercentageLength, 25));



     tableFormat.setColumnWidthConstraints(columnLength);
     table = cursor.insertTable(20, 6, tableFormat);
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #9 : Март 11, 2013, 14:29 »

Мой пример запускали? У меня столбцы все разной ширины. В сумме 100%
Записан
Pupil
Гость
« Ответ #10 : Март 12, 2013, 08:45 »

Проверил для "очистки совести". Ваш фрагмент работает. Но у меня (выложил код ранее) - формирование таблицы происходит по-другому. )
Записан
Pupil
Гость
« Ответ #11 : Март 14, 2013, 12:31 »

По фрагменту, который я выложил, можно чётко понять как он работает. Я не Страуструп, но предположу, что класс QTextTable, как бывает в Qt, не содержит необходимых методов высокого уровня. )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.133 секунд. Запросов: 24.