查找对话框的逻辑实现

查找对话框的查找逻辑

查找对话框的核心逻辑

  1. 获取当前光标的位置并作为起始点
  2. 向后(向前)查找目标第一次出现的位置
  3. 通过目标位置以及目标长度在文本框中进行标记

功能查找的实现

QString类中提供了子串查找的相关函数

indexOf(value, index)
从指定位置向后查找子串的下标位置
lastIndexOf(value, index)
从指定位置向前查找子串的下标位置,向前查找index需要负数。

Qt中光标信息类QTextCursor

所有的光标相关信息都通过这个类描述如:光标位置,文本选择等

查找算法流程图

查找对话框的逻辑实现_第1张图片

具体代码实现

void FindDialog::onFindClicked()
{
    QString target = m_findEdit.text();
    
    if( (m_PText != NULL) && (target != "") )
    {
        QString text = m_PText->toPlainText();
        QTextCursor c = m_PText->textCursor();
        int index = -1;
        
        if(m_forwardBtn.isChecked())
        {
            index = text.indexOf(target, c.position(), m_mathChkBx.isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive);   //从鼠标坐标处查找,后两个参数一个大小写敏感一个是不敏感

            if( index >= 0 )
            {
                c.setPosition(index);
                c.setPosition(index + target.length(), QTextCursor::KeepAnchor);

                m_PText->setTextCursor(c);
            }
        }

        if(m_backwardBtn.isChecked())
        {
            index = text.lastIndexOf(target, c.position()-text.length()-1, m_mathChkBx.isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive);

            if(index >= 0)
            {
                c.setPosition(index + target.length());
                c.setPosition(index, QTextCursor::KeepAnchor);

                m_PText->setTextCursor(c);
            }
        }

        if(index < 0)
        {
            QMessageBox msg(this);

            msg.setWindowTitle("Find");
            msg.setText("Can not find \"" + target + "\" any more...");
            msg.setIcon(QMessageBox::Information);
            msg.setStandardButtons(QMessageBox::Ok);

            msg.exec();
        }
    }
}

你可能感兴趣的:(学习笔记,Qt,c++)