Как сделать обернутый текстовый искатель?
Я работаю над поиском текста в 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);
}
}