save cursor position of qtextedit

无人久伴 提交于 2021-01-29 20:26:12

问题


setCurrentCharFormat() function does not take a current cursor position as a parameter. And so in order to set the char format for arbitrary text in the control I have to save the curent cursor position, set the char format and then restore it.

However, I don't see any thing like cursorPosition() in the docs.

Am I missing something?

Or maybe there is a better way of doing what I want?


回答1:


I think you're looking for the QTextEdit::textCursor() method which returns a copy of the editor's QTextCursor. You can then manipulate the cursor as needed (including changing char. format and inserting text with specific format). If you need the cursor changes to persist (like the char. format), then make sure to QTextEdit::setCursor() afterwards.

A very basic example of inserting some text:

  QTextCursor cursor(ui->textEdit->textCursor());
  cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor, 1);
  cursor.insertText(text);


ADDED: Perhaps the Qt Text Edit example will help. Specifically, in textedit.cpp where we see something like this:
  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);
  }


2nd ADDITION (based on comment):

So, if my cursor is at the line 3 col 10 and I call the function like this: SetCharFormat( 2, 5, attr ); it stores the current cursor position as (3, 10), then selects the text for text characters 2 and 5, set the text attribute for the selection, and then cursor will move back to the old position/selection.

Below is a specific example of what I think you're describing. One thing overall though, the text cursor position only has one dimension, which is, essentially, the number of visible characters from the start of the document. (The text cursor should not be confused with a QCursor which represents a mouse pointer with x,y coordinates.)

This simple test shows an editor with the text "I like this program." and a button. The button (or Alt-D) will toggle bold formatting on the word "like" while keeping the visible cursor position (and any selection) unchanged.

I've also included some sample code which moves the visible cursor initially, and in the formatting function there is a commented-out example of how to save and restore the cursor position programmatically. It is not needed in this particular example because the visible cursor is never modified.

#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();
}



来源:https://stackoverflow.com/questions/56743582/save-cursor-position-of-qtextedit

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!