Как сделать обернутый текстовый искатель?

Я работаю над поиском текста в QtCreator(C++). Я использовал функцию "QtextEdit::find", и она находит каждое вхождение искомого слова до тех пор, пока документ не достигнет конца, когда нажата кнопка NEXT. Теперь я хочу добавить "QCheckBox", который при включении перезапускает "искатель" в начале документа и продолжает поиск. Есть ли у вас какие-либо предложения, как это сделать, учитывая, что "QTextEdit::find" возвращает bool? Вот моя функция поиска:

void textFinder(const QString& textToFind, bool rev, bool wrappedSearch)
{
 QTextDocument *document = this->document();
 QTextCursor cursor (document);

QTextDocument::FindFlags flag;
if (rev == flag)
  flag |= QTextDocument::FindBackward;

bool found = find(textToFind, flag);

if (wrappedSearch == true){
   cursor.movePosition(QTextCursor::Start);
}

}

Панель инструментов, которую я сделал, содержит QLineEdit, QPushButtonи QCheckBox,

3 ответа

Спасибо за ваши ответы! Это мне очень помогло. Для моего кода это работает так:

    if (searchWrapped == true && !found){
        if (rev == false && cursor.atStart() == true){
            cursor.movePosition(QTextCursor::End);
            found = find (text, flag);
        }

        if (rev && cursor.atEnd() == true){
            cursor.movePosition(QTextCursor::Start);
            found = find (text, flag);
            }
        }
        setTextCursor(cursor);

}

Если я понял вопрос, вам нужна помощь в реализации свернутого поиска. Тогда я думаю, что будет достаточно выполнить другой поиск после перемещения курсора в начало или конец документа, в зависимости от того, будет ли поиск обратным:

void textFinder(const QString& textToFind, bool rev, bool wrappedSearch)
{
    QTextDocument *document = this->document();
    QTextCursor cursor (document);

    QTextDocument::FindFlags flag;
    if (rev == flag)
      flag |= QTextDocument::FindBackward;

    bool found = find(textToFind, flag);

    if (!found&&wrappedSearch == true)
    {
       cursor.movePosition(rev?QTextCursor::End:QTextCursor::Start);
       found = find(textToFind, flag);
    }

}

Есть несколько проблем с вашим кодом и логикой внутри него.

Прежде всего, я не понимаю, почему вы сравниваете rev хулиганить flag переменная. Не стоит ли сравнить это с true? Я также установил бы начальное значение flag переменная к 0,

Во-вторых, если для обернутого поиска задано значение true, оборачивать его следует только в том случае, если QTextEdit::find возвращенный false, В противном случае вы застряли бы в начале документа.

Затем вы должны также проверить, если значение rev является true перед установкой курсора на начало. Если вы ищете в обратном направлении, вы должны установить курсор в конец документа при переносе.

И вы также должны установить текстовый курсор обратно к вашему редактированию текста после его изменения.

Вот моя рабочая функция поиска, я не подкласс QTextEdit потому что мне было лень, но логика та же.

void MainWindow::findText(const QString &text, bool rev, bool wrapped)
{
    QTextDocument::FindFlags flag = 0;
    if(rev)
      flag = flag | QTextDocument::FindBackward;

    bool found = ui->textEdit->find(text, flag);
    if(!found && wrapped)
    {    
        QTextCursor cursor = ui->textEdit->textCursor();
        if(!rev)
            cursor.movePosition(QTextCursor::Start);
        else
            cursor.movePosition(QTextCursor::End);
        ui->textEdit->setTextCursor(cursor);
        ui->textEdit->find(text, flag);
    }
}
Другие вопросы по тегам