如何使用QTextCursor选择最近添加的文本

时间:2016-09-28 15:23:54

标签: qt

我正在使用下面的函数在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);

工作正常。但我想做的是(在此功能之后)选择刚刚添加的文本。这样,如果我愿意,我可以增加两次或三次压痕。我该怎么做呢?

2 个答案:

答案 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);