如何做一个包装文本查找器?

时间:2015-01-06 13:04:42

标签: c++ qt find qtextedit

我正在使用QtCreator(c ++)中的文本查找器。我使用了一个“QtextEdit :: find”函数,它会找到搜索到的单词的每次出现,直到文档到达结尾时,按下NEXT按钮。现在我想添加一个“QCheckBox”,当检查时,重新启动文档开头的“finder”并继续搜索。 考虑到“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);
}

}

我所做的工具栏包含QLineEditQPushButtonQCheckBox

3 个答案:

答案 0 :(得分:0)

如果我已经理解了您想要帮助实现包装搜索的问题。然后我认为根据是否反向搜索将光标移动到文档的开头或结尾后执行另一次搜索就足够了:

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

}

答案 1 :(得分:0)

您的代码及其中的逻辑存在一些问题。

首先,我不明白为什么要将rev bool与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);
    }
}

答案 2 :(得分:0)

感谢您的回答!那些帮助了我很多。对于我的代码,它的工作原理如下:

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

}