我正在使用下面的函数在QPlainTextWidget中的一段选定文本中增加缩进(三个空格):
QTextCursor cursor = ui->ceEditor->textCursor();
QString text = cursor.selectedText();
QString tab = " ";
QChar sep = QChar(0x2029);
QStringList lines = text.split(sep,QString::KeepEmptyParts);
for (qint32 i = 0; i < lines.size(); i++){
lines[i] = tab + lines.at(i);
}
text = lines.join(sep);
cursor.removeSelectedText();
cursor.insertText(text);
工作正常。但我想做的是(在此功能之后)选择刚刚添加的文本。这样,如果我愿意,我可以增加两次或三次压痕。我该怎么做呢?
答案 0 :(得分:1)
我会通过在调用anchor()
之前保存cursor
中的position()
和insertText()
来实现这一点,以便我们可以使用这些旧值和光标&#39 ; s position()
插入文本后(因为这保证在插入文本的末尾)来计算新选择。
此外,无需像removeSelectedText()
中那样调用insertText()
,以下是您的代码的样子:
QTextCursor cursor = ui->ceEditor->textCursor();
QString text = cursor.selectedText();
QString tab = " ";
QChar sep = QChar(0x2029);
QStringList lines = text.split(sep,QString::KeepEmptyParts);
for (qint32 i = 0; i < lines.size(); i++){
lines[i] = tab + lines.at(i);
}
text = lines.join(sep);
textEdit.setFocus();
//save anchor and position before inserting text
int oldAnchor= cursor.anchor();
int oldPosition= cursor.position();
cursor.insertText(text);
//select text between new cursor position and old selection start
int newPosition, newAnchor;
if(oldAnchor< oldPosition){
newAnchor= oldAnchor;
newPosition= cursor.position();
} else {
newAnchor= cursor.position();
newPosition= oldPosition;
}
cursor.setPosition(newAnchor, QTextCursor::MoveAnchor);
cursor.setPosition(newPosition, QTextCursor::KeepAnchor);
ui->ceEditor->setTextCursor(cursor);
请注意,您可以从光标的新position()
开始选择文本,然后返回text.length()
,并避免保存旧的anchor()
和position()
值。但是这样,您无法保留选择方向(即选择是从左到右还是从右到左)
答案 1 :(得分:0)
尝试在功能结束时添加以下代码
for(int i = 0; i<text.length(); i++)
ui->ceEditor->moveCursor(QTextCursor::MoveOperation::Left,QTextCursor::MoveMode::KeepAnchor);