Почему этот код не выделяет искомый термин, найденный? - PullRequest
1 голос
/ 02 января 2012

Приведенный ниже код не выделяет поисковый термин, когда он найден. Фактически курсор исчезает из QPlainTextEdit (называемого ui-> Editor) после нажатия кнопки «Далее». Что вызывает это?

void TextEditor::findNextInstanceOfSearchTerm()
{
    QString searchTerm = this->edtFind->text();

    if(this->TextDocument == NULL)
    {
        this->TextDocument = ui->Editor->document();
    }


    QTextCursor documentCursor(this->TextDocument);

    documentCursor = this->TextDocument->find(searchTerm,documentCursor);

    if(!documentCursor.isNull())
    {
        documentCursor.select(QTextCursor::WordUnderCursor);

    }else
    {
        ui->statusbar->showMessage("\""+searchTerm+"\" could not be found",MESSAGE_DURATION);

    }
}

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Во-первых, ваш код создает новый курсор в начале документа каждый раз, когда вы нажимаете следующую кнопку, поэтому вы всегда будете искать с начала.Во-вторых, вы должны понимать, что курсор, которым вы манипулируете, не имеет ничего общего с курсором в вашем QPlainTextEdit: вы манипулируете копией.Если вы хотите повлиять на редактирование текста, вы должны изменить его курсор, используя setTextCursor.Вот рабочее решение:

void TextEditor::findNextInstanceOfSearchTerm()
{
    QString searchTerm = this->edtFind->text();

    if(this->TextDocument == NULL)
    {
        this->TextDocument = ui->Editor->document();
    }

    // get the current cursor
    QTextCursor documentCursor = ui->Editor->textCursor();

    documentCursor = this->TextDocument->find(searchTerm,documentCursor);

    if(!documentCursor.isNull())
    {
        // needed only if you want the entire word to be selected
        documentCursor.select(QTextCursor::WordUnderCursor);

        // modify the text edit cursor
        ui->Editor->setTextCursor(documentCursor);
    }
    else
    {
        ui->statusbar->showMessage(
            "\""+searchTerm+"\" could not be found",MESSAGE_DURATION);
    }
}

В качестве примечания вы можете узнать, что QPlainTextEdit предоставляет метод find, так что это может быть более простой способдостичь того, что вы хотите:

void TextEditor::findNextInstanceOfSearchTerm()
{
    QString searchTerm = this->edtFind->text();

    bool found = ui->Editor->find(searchTerm);

    if (found)
    {
        QTextCursor cursor = ui->Editor->textCursor();
        cursor.select(QTextCursor::WordUnderCursor);
        ui->Editor->setTextCursor(cursor);
    }
    else
    {
        // set message in status bar
    }
}
1 голос
/ 02 января 2012
  1. Использование QTextCursor::EndOfWord
  2. Используйте QPlainTextEdit::setExtraSelections, чтобы выделить / выделить что-то в QPlainTextEdit

Просто у вас уже есть курсор, который выделит слово, но вы не применили его к редактированию текста

...