为什么这个代码在找到搜索词后不突出显示?

Why does this code not highlight the search term once found?

本文关键字:显示 搜索 代码 为什么      更新时间:2023-10-16

下面的代码在找到搜索词时不突出显示搜索词。事实上,按下"下一步"按钮后,光标从QPlainTextEdit(称为ui->编辑器)中消失。是什么引起的?

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

首先,每次按下下一个按钮时,代码都会在文档的开头创建一个新的光标,因此始终会从开头开始搜索。其次,您必须明白,您操作的游标与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. 使用QTextCursor::EndOfWord
  2. 使用QPlainTextEdit::setExtraSelections选择/突出显示qplaintexttedit

只是你已经有了光标可以突出显示单词,但是你没有把它应用到文本编辑