簡體   English   中英

帶Qml TextEdit的QTextObjectInterface(QQuickTextEdit)

[英]QTextObjectInterface with Qml TextEdit (QQuickTextEdit)

我為簡單的QTextObjectInterface處理程序, QTextObjectInterface繪制了10x10的紅色矩形。 當我在普通的QWidget應用程序中使用QTextEdit時,它工作正常。
當我在Qt Quick應用程序中使用QQuickTextEdit (TextEdit QQuickTextEdit組件)時,它不起作用(沒有繪制,但TextEdit中的矩形是保留的,因為當我改變光標位置時,我注意到有東西,但只是空白空間什么都沒畫。
調用QTextObjectInterface intrinsicSize方法(這解釋了為什么我看到有空格10x10),但drawObject方法不是。

我做了一些研究,我發現實際上問題可能在這里:

Qt 5.3.0來源的QQuickTextEdit.cpp(第1821行)

QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) {
.
.
.
if (textFrame->firstPosition() > textFrame->lastPosition()
        && textFrame->frameFormat().position() != QTextFrameFormat::InFlow) {
    updateNodeTransform(node, d->document->documentLayout()->frameBoundingRect(textFrame).topLeft());
    const int pos = textFrame->firstPosition() - 1;
    ProtectedLayoutAccessor *a = static_cast<ProtectedLayoutAccessor *>(d->document->documentLayout());
    QTextCharFormat format = a->formatAccessor(pos);
    QTextBlock block = textFrame->firstCursorPosition().block();
    node->m_engine->setCurrentLine(block.layout()->lineForTextPosition(pos - block.position()));
    node->m_engine->addTextObject(QPointF(0, 0), format, QQuickTextNodeEngine::Unselected, d->document,
                                  pos, textFrame->frameFormat().position());
    nodeStart = pos;
}

它永遠不會達到調用node->m_engine->addTextObject程度。
這是因為if條件textFrame->firstPosition() > textFrame->lastPosition()這一部分被評估為false
我試過std::coutfirstPostionlastPosition時,我所建立的環境和firstPosition0lastPosition1

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QTextDocument>
#include <QQuickTextDocument>
#include <iostream>
#include <QTextCursor>
#include <QTextBlock>
#include <QPainter>
#include <QAbstractTextDocumentLayout>
#include <QTextCharFormat>
#include "qmlcomponentspace.h"
#include <QTextEdit>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QTextDocument * doc = engine.rootObjects().first()->findChild<QObject *>("editor")->property("textDocument").value<QQuickTextDocument *>()->textDocument();

    QTextCursor cur(doc);

    int objectType = QTextFormat::UserObject + 1000;

    QmlComponentSpace * component = new QmlComponentSpace();

    doc->documentLayout()->registerHandler(objectType, component);

    QTextCharFormat fmt;
    fmt.setObjectType(objectType);
    fmt.setForeground(Qt::red);
    fmt.setBackground(Qt::red);

    cur.movePosition(QTextCursor::End);

    cur.insertText(QString(QChar::ObjectReplacementCharacter), fmt);

    std::cout << "FIRST:" << doc->rootFrame()->firstPosition() << std::endl;
    std::cout << "END:" << doc->rootFrame()->lastPosition() << std::endl;

    return app.exec();
}

我錯過了什么?

文件說到了

http://doc.qt.io/qt-5/qquicktextdocument.html#details

Warning: The QTextDocument provided is used internally by Qt Quick elements to provide text manipulation primitives. You are not allowed to perform any modification of the internal state of the QTextDocument. If you do, the element in question may stop functioning or crash.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM