Kra*_*rab 5 c++ qt qtextedit qml
我注册了简单的处理程序,它只QTextObjectInterface绘制了10x10的红色矩形.当我QTextEdit在普通的QWidget应用程序中使用时,它工作.
当我QQuickTextEdit在Qt Quick应用程序中使用(TextEdit qml组件)时,它不起作用(没有绘制,但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;
}
Run Code Online (Sandbox Code Playgroud)
它永远不会到达node->m_engine->addTextObject被调用的地步.
这是因为评估了这部分if条件.
我尝试了,当我建立上下文时,是,是.textFrame->firstPosition() > textFrame->lastPosition()falsestd::coutfirstPostionlastPositionfirstPosition0lastPosition1
#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();
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
文档说在
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.