Я думаю, вы ищете метод QTextEdit::textCursor()
, который возвращает копию редактора QTextCursor
.Затем вы можете манипулировать курсором по мере необходимости (включая изменение формата символов и вставку текста с определенным форматом ).Если вам нужно, чтобы изменения курсора сохранялись (например, в символьном формате), затем обязательно QTextEdit::setCursor()
.
Очень простой пример вставки текста:
QTextCursor cursor(ui->textEdit->textCursor());
cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor, 1);
cursor.insertText(text);
ДОБАВЛЕНО: Возможно, пример Qt
Text Edit поможет.В частности, в
textedit.cpp , где мы видим что-то вроде этого:
void TextEdit::textBold()
{
QTextCharFormat fmt;
fmt.setFontWeight(actionTextBold->isChecked() ? QFont::Bold : QFont::Normal);
mergeFormatOnWordOrSelection(fmt);
}
void TextEdit::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
{
QTextCursor cursor = textEdit->textCursor();
if (!cursor.hasSelection())
cursor.select(QTextCursor::WordUnderCursor);
cursor.mergeCharFormat(format);
textEdit->mergeCurrentCharFormat(format);
}
2-е ДОПОЛНЕНИЕ (на основе комментариев):
Итак,если мой курсор находится в строке 3 col 10 и я вызываю функцию следующим образом: SetCharFormat (2, 5, attr);текущая позиция курсора сохраняется как (3, 10), затем выбирается текст для текстовых символов 2 и 5, устанавливается текстовый атрибут для выделения, а затем курсор возвращается к старой позиции / выделению.
Ниже приведен конкретный пример того, что я думаю, вы описываете.В общем и целом, позиция текстового курсора имеет только одно измерение, которое, по сути, является количеством видимых символов с начала документа.(Текстовый курсор не следует путать с QCursor
, который представляет указатель мыши с координатами x, y.)
Этот простой тест показывает редактор с текстом «Мне нравится эта программа».и кнопка.Кнопка (или Alt-D
) переключит форматирование жирным шрифтом на слове «like», оставив неизменным положение видимого курсора (и любого выделения).
Я также включил пример кода, который перемещает видимый курсорпервоначально, и в функции форматирования есть закомментированный пример того, как программно сохранять и восстанавливать позицию курсора.В этом конкретном примере он не нужен, поскольку видимый курсор никогда не изменяется.
#include <QtWidgets>
class Dialog : public QDialog
{
public:
Dialog(QWidget *parent = nullptr) : QDialog(parent)
{
QTextEdit *textEdit = new QTextEdit("I like this program.", this);
// Position cursor at end of sentence (just as an example)
QTextCursor cursor(textEdit->textCursor());
cursor.movePosition(QTextCursor::End);
textEdit->setTextCursor(cursor); // required for the visible cursor to actually move
QToolButton *btnTest = new QToolButton(this);
btnTest->setText("&Do it");
btnTest->setCheckable(true);
connect(btnTest, &QToolButton::toggled, this, [textEdit, btnTest](bool checked)
{
// Function to toggle bold formatting on a section of text in the editor.
const int start = 2; // start of "like"
const int end = start + 4; // length of "like"
// the formatting to be applied
QTextCharFormat format;
format.setFontWeight(checked ? QFont::Bold : QFont::Normal);
format.setForeground(checked ? QBrush(Qt::red) : QPalette().text());
format.setBackground(checked ? QBrush(Qt::gray) : QPalette().base());
QTextCursor cursor(textEdit->textCursor()); // get a copy of the editor's cursor
// const int oldCursorPos = cursor.position(); // save cursor position (not needed for this example)
cursor.setPosition(start, QTextCursor::MoveAnchor); // move w/out selection
cursor.setPosition(end, QTextCursor::KeepAnchor); // move and select
cursor.mergeCharFormat(format); // apply format to selection
// cursor.setCharFormat(format); // alternative to mergeChatFormat()
// cursor.setPosition(oldCursorPos); // restore cursor position
// cursor.setPosition(end); // or move it to the end of the affected text
// textEdit->setTextCursor(cursor); // required for the visible cursor to move
btnTest->setText(checked ? "Un&do it" : "Re&do it");
});
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(textEdit);
layout->addWidget(btnTest);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
return Dialog().exec();
}