- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Qt5 开发一个简单的文本编辑器程序。我的编辑器组件是 QPlainTextEdit
的子类,对于一些基本功能,我从 this Qt demo program 中窃取了一些代码。 .似乎相互干扰的两个功能是突出显示编辑器当前行的代码(它连接到文本编辑的 cursorPositionChanged()
信号,就像演示所示) :
QList<QTextEdit::ExtraSelection> es;
QTextEdit::ExtraSelection selection;
selection.format.setBackground(currentLineHighlight);
selection.format.setProperty(QTextFormat::FullWidthSelection, true);
selection.cursor = textCursor();
selection.cursor.clearSelection();
es.append(selection);
setExtraSelections(es);
我编写的代码用于执行非常常见的“当您在选择多行时点击 Tab 键时缩进所有行”的事情:
QTextCursor curs = textCursor();
if(!curs.hasSelection())
return;
// Get the first and count of lines to indent.
int spos = curs.anchor(), epos = curs.position();
if(spos > epos)
{
int hold = spos;
spos = epos;
epos = hold;
}
curs.setPosition(spos, QTextCursor::MoveAnchor);
int sblock = curs.block().blockNumber();
curs.setPosition(epos, QTextCursor::MoveAnchor);
int eblock = curs.block().blockNumber();
// Do the indent.
curs.setPosition(spos, QTextCursor::MoveAnchor);
curs.beginEditBlock();
for(int i = 0; i <= (eblock - sblock); ++i)
{
curs.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor);
curs.insertText("\t");
curs.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor);
}
curs.endEditBlock();
// Set our cursor's selection to span all of the involved lines.
curs.setPosition(spos, QTextCursor::MoveAnchor);
curs.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor);
while(curs.block().blockNumber() < eblock)
{
curs.movePosition(QTextCursor::NextBlock, QTextCursor::KeepAnchor);
}
curs.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
setTextCursor(curs);
这两个功能都运行良好 - 至少在大部分时间都是如此。当我执行以下操作时,似乎有一个涉及这两个的奇怪错误:
此时,在一组缩进的行的最后一行,行高亮显示并没有像往常一样一直延伸到整个编辑器——它只延伸到行尾。如果我将光标移到该行的末尾,然后按“Enter”键,问题就会解决。
我已经尝试了几种方法来尝试诊断这个问题,包括尝试移动光标和/或 anchor 而不是仅仅在突出显示函数中调用 clearSelection()
,并尝试检查/遍历构成编辑器文档的 QTextBlock
试图找出一些差异,但此时我不知所措。我根本无法让这段代码按照我期望的方式运行。
我发现现在呈现不正确的行可以“修复”,但可以向该行添加任何字符,或者通过调整窗口大小。
此外,如果我在缩进函数末尾删除 setTextCursor
调用,此错误仍然会发生。
这两件事让我相信这个错误与文本光标或文档内容无关,所以在这一点上我倾向于认为它是 Qt 渲染额外选择中的错误。
有人看到我哪里出错了吗?
最佳答案
这实际上是Qt中的一个错误,而不是OP中代码的问题。参见 QTBUG-30051 - QTextCursor and beginEditBlock breaks layout .
关于c++ - Qt 5 QPlainTextEdit 在 "undo"之后突出显示当前行失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19719622/
有没有一种方法可以“标记”对象的属性,使它们在反射中“突出”? 例如: class A { int aa, b; string s1, s2; public int AA
我是一名优秀的程序员,十分优秀!