无法突出显示处理TextEdit

时间:2015-11-29 11:57:49

标签: qt qml syntax-highlighting

TL; DR:TextEdit仅在我点击时突出显示文本。什么都没有帮助

我有一个带有字符串属性的ListView模型的QAbstractListModel。 这些字符串属性正在拼写检查,QSyntaxHighlighter用于显示拼写错误。我在QSyntaxHighlighter的{​​{1}}中创建Component.onCompleted后代。我仔细检查突出显示使用正确的拼写错误执行get,并使用正确的位置执行荧光笔的TextEdit。问题是,只有当我点击setFormat()本身时,它才会以红色(无效)绘制文字。

TextEdit位于TextEdit(跟踪光标),Flickable位于Flickable(具有良好的背景和边框)。绑定到某些信号并调用Rectangle的update()无济于事。

拼写检查完成后,我发出创建的SyntaxHighlighter的TextEdit信号。

rehighlight()

以下是项目的一小部分示例,演示了在点击文字https://bitbucket.org/ribtoks/qt-highlighting-issue

之前它是如何工作的

我有什么想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

问题可能是由QTBUG-44765引起的,在Qt 5.5中已修复。

鉴于错误程度较低,我认为实际上不会解决这个问题。

当你完成语法高亮显示时,你可以通过在TextEdit中附加一个空字符串来解决这个问题

TextEdit {
    id: captionTextEdit
    width: wrapperFlick.width
    height: wrapperFlick.height
    text: display
    readOnly: true

    Component.onCompleted: {
        itemsModel.initHighlighter(index, captionTextEdit.textDocument)
    }

    Connections {
        target: itemsModel
        onUpdateTextEdit: {
            console.log("Update element at index: " + indexToUpdate)

            if (indexToUpdate == index)
            {
                console.log("Update me!")
                captionTextEdit.append("")
            }
        }
    }

    onCursorRectangleChanged: wrapperFlick.ensureVisible(cursorRectangle)
}

其中updateTextEdit(indexToUpdate)是您的itemsModel必须发出的新信号。

itemsmodel.h

signals:
    void updateTextEdit(int indexToUpdate);

itemsmodel.cpp

void ItemsModel::initHighlighter(int index, QQuickTextDocument *document) {
    // Signal mapper could be avoided if lamda slot are available (Qt5 and C++11)
    QSignalMapper* signalMapper = new QSignalMapper(this);

    if (0 <= index && index < m_ItemsList.length()) {
        SingleItem *item = m_ItemsList.at(index);
        SpellCheckHighlighter *highlighter = new SpellCheckHighlighter(document->textDocument(), item);
        QObject::connect(item, SIGNAL(spellCheckResultsReady()),
                         highlighter, SLOT(rehighlight()));

        // TODO: Don't connect this slot for Qt 5.5+ to avoid performance overhead
        QObject::connect(item, SIGNAL(spellCheckResultsReady()),
                         signalMapper, SLOT(map()));
        signalMapper->setMapping(item, index);
    }

    connect(signalMapper, SIGNAL(mapped(int)),
            this, SIGNAL(updateTextEdit(int)));
}

此处提供完整代码:https://bitbucket.org/swarta/rehighlighdemo/branch/workaround#diff

答案 1 :(得分:1)

在5.11.2上遇到此问题,并找到了以下修复程序,该更新程序允许更新单个块而不必突出显示/取消选择整个文本区域

rehighlightBlock(newBlock);
Q_EMIT document()->documentLayout()->updateBlock(newBlock);