сохранить позицию курсора qtextedit - PullRequest
0 голосов
/ 24 июня 2019

setCurrentCharFormat () функция не принимает текущую позицию курсора в качестве параметра.И поэтому, чтобы установить формат символа для произвольного текста в элементе управления, я должен сохранить текущую позицию курсора, установить формат символа и затем восстановить его.

Однако я не вижу ничего подобного cursorPosition() в документах.

Я что-то упустил?

Или, может быть, есть лучший способ сделать то, что я хочу?

1 Ответ

1 голос
/ 25 июня 2019

Я думаю, вы ищете метод 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();
}

...