Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Pupil от Март 11, 2013, 08:39



Название: Столбцы индивидуальной ширины в QTextTable
Отправлено: Pupil от Март 11, 2013, 08:39
Приветствую всех!

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

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

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




Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Hellraiser от Март 11, 2013, 09:32
Ссылка на букварь (http://qt-project.org/doc/qt-4.8/qtexttableformat.html#details). Особенно смотреть последний абзац в детальном описании. Индивидуальной ширины можно добиваться через QTextLength::FixedLength


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Pupil от Март 11, 2013, 09:51
Пробовал через QTextLength - не работает. )


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Hellraiser от Март 11, 2013, 09:55
Без какого-либо конкретного кода даже бессмысленно обсуждать. Или вы считаете, что разработчики Qt просто так пишут "всякие не работающие глупости" в букварь?


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Pupil от Март 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);
}


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Hellraiser от Март 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();
}


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Pupil от Март 11, 2013, 12:53
Данные берутся из базы.
Проверил - при моём варианте забивания данных - не работает.
Как были столбцы одинаковой ширины - так и остались. )


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Pupil от Март 11, 2013, 13:24
Походу пьесы всё дело в библиотеке Libra Офиса. Возможности пятикантропного форматирования...


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Pupil от Март 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);


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Hellraiser от Март 11, 2013, 14:29
Мой пример запускали? У меня столбцы все разной ширины. В сумме 100%


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Pupil от Март 12, 2013, 08:45
Проверил для "очистки совести". Ваш фрагмент работает. Но у меня (выложил код ранее) - формирование таблицы происходит по-другому. )


Название: Re: Столбцы индивидуальной ширины в QTextTable
Отправлено: Pupil от Март 14, 2013, 12:31
По фрагменту, который я выложил, можно чётко понять как он работает. Я не Страуструп, но предположу, что класс QTextTable, как бывает в Qt, не содержит необходимых методов высокого уровня. )