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
之前它是如何工作的我有什么想法可以解决这个问题吗?
答案 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);