QAbstractTextDocument zweispaltiges Layout

Alles rund um die Programmierung mit Qt
Antworten
metalmike
Beiträge: 2
Registriert: 11. November 2008 23:26

QAbstractTextDocument zweispaltiges Layout

Beitrag von metalmike »

Hallo,

ich bin gerade dabei mittels einer QAbstractTextDocument subclass ein Layout für ein zweispaltiges Dokument zu erstellen.
Das erstellen des Rahmens und der mittleren Trennlinie funktioniert soweit,
nur wird der TextCursor leider nicht mehr angezeigt und auch
Text mittels

Code: Alles auswählen

QTextCursor::insertText() 
wird nicht angezeigt.

Hier mal meine subclass:

Code: Alles auswählen

MyTextDocumentLayout::MyTextDocumentLayout(QPrinter *printer, QTextDocument *document) :
    QAbstractTextDocumentLayout(document),
    m_printer(printer)
{
    qDebug() << "MyTextDocumentLayout ctor";
}


QRectF MyTextDocumentLayout::blockBoundingRect(const QTextBlock &block) const
{
    qDebug() << "MyTextDocumentLayout::blockBoundingRect";
    qDebug() << "blockCount(): " << document()->blockCount();
    qDebug() << "lineCount(): " << block.lineCount();
    qDebug() << "length(): " << block.length();
    qDebug() << "text(): " << block.text();

    QTextCharFormat charFormat = block.charFormat();

    QFontMetrics fm = charFormat.font();

    qDebug() << "fm.height()" << fm.height();
    qDebug() << "block.length()" << block.length();

    return QRectF(0, 0, block.length(), fm.height());
}

void MyTextDocumentLayout::draw(QPainter *painter, const PaintContext &context)
{
    qDebug() << "context.CursorPosition " << context.cursorPosition;
    qDebug() << "context.clip " << context.clip;

    QRect paperRect = m_printer->paperRect();

    //Rand hinzufügen
    int leftMargin = 10;
    int topMargin = 10;
    paperRect.setX(paperRect.x() + leftMargin);
    paperRect.setY(paperRect.y() + topMargin);

    QPen pen;
    pen.setWidth(2);

    painter->setPen(pen);
    painter->drawRect(paperRect);

    pen.setWidth(3);
    painter->setPen(pen);
    painter->drawLine(paperRect.width() / 2 + leftMargin,
                      topMargin,
                      paperRect.width() / 2 + leftMargin,
                      paperRect.height());
}

int MyTextDocumentLayout::hitTest(const QPointF &point, Qt::HitTestAccuracy accuracy) const
{
    qDebug() << "MyTextDocumentLayout::hitTest()";
    qDebug() << "point: " << point;
    qDebug() << "Qt::HitTestAccuracy: " << accuracy;

    return accuracy;
}

int MyTextDocumentLayout::pageCount() const
{
    qDebug() << "MyTextDocumentLayout::pageCount()";

    return 1;
}

QSizeF MyTextDocumentLayout::documentSize() const
{
    qDebug() << "MyTextDocumentLayout::documentSize()";

    return m_printer->paperSize(QPrinter::DevicePixel);
}

QRectF MyTextDocumentLayout::frameBoundingRect(QTextFrame *frame) const
{
    qDebug() << "MyTextDocumentLayout::frameBoundRect()";

    return QRectF(0.0, 0.0, 10.0, 10.0);
}

void MyTextDocumentLayout::documentChanged(int from, int charsRemoved, int charsAdded)
{
    qDebug() << "MyTextDocumentLayout::documentChanged()";
    qDebug() << "from: " << from;
    qDebug() << "charsRemoved: " << charsRemoved;
    qDebug() << "charsAdded: " << charsAdded;
}
Wie bekommen ich einen Textcursor angezeigt?
Muss ich den in der draw() Funktion zeichnen?

Vielen Dank!
Grüße,

Mike
Antworten