Seite 1 von 1

QAbstractTextDocument zweispaltiges Layout

Verfasst: 16. Oktober 2010 22:57
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