Hola:

Ya he dado mucho la tabarra con este problema en otros sitios, pero nadie me ha dado ninguna solución.

Resulta que necesito crear un documento mediante QTextEdit y QTextDocument. El documento será un sobre y tendrá una tabla con una sola celda donde estará la dirección. Esa tabla quiero que esté alineada a la derecha y, a falta de ajustarlo algo mejor, en el centro vertical.

La alineación derecha no comporta ningún problema, pero sí la alineación vertical, que de ninguna manera consigo que salga.

Hablando con Albert Astals, me sugirió que quizás la altura del documento es la altura de la tabla, y que por eso no tiene espacio para moverse verticalmente (corrígeme si me equivoco en la transcripción, Albert). Esto podría ser así, pero entonces no sé cómo conseguir que sí que tenga suficiente espacio para que se alinee verticalmente. De hecho, creo que si me está siendo tan difícil en parte es porque o la documentación o la implementación son erróneas, pero necesito llegar al núcleo del problema para sugerir los cambios necesarios para que sea más sencillo.

Como ejemplo, he escrito un pequeño programa:

#include "mainwindow.h"
#include <QTextEdit>
#include <QTextCursor>
#include <QTextTable>
#include <QTextTableFormat>
#include <QTextDocument>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QString string = "Some text to check whether alignment is working or not.\n"
            "I only have to write some sentences.\n"
            "Long or short, it doesn't matter.";

    QTextEdit *editor = new QTextEdit(this);
    setCentralWidget(editor);
    resize(400,400);

    QTextDocument *document = new QTextDocument;
    editor->setDocument(document);

    QTextCursor cursor = editor->textCursor();
    cursor.movePosition(QTextCursor::Start);

    QTextTableFormat tableFormat;

    /*Qt::AlignCenter should align the table horizontally and vertically, but it only aligns horizontally.

    Other possibilities are:
    -Qt::AlignBottom
    -Qt::AlignVCenter
    but none of them aligns the table vertically*/

    tableFormat.setAlignment(Qt::AlignCenter);
    tableFormat.setWidth(QTextLength(QTextLength::PercentageLength,40));
    tableFormat.setBorder(1);

    QTextTable *table = cursor.insertTable(1,1,tableFormat);

    cursor = table->cellAt(0,0).firstCursorPosition();
    cursor.insertText(string);
}


Y un simple fichero de cabecera que es más que obvio:

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
};

Finalmente, publiqué un bug en su momento, con un programa de ejemplo más elaborado: https://bugreports.qt-project.org/browse/QTBUG-25782

En fin, si alguien tiene alguna idea sobre cómo **** alinear verticalmente, ya sabe qué hacer :-)

Un saludo

David Gil
www.hackingastrology.net