查找对话框的查找逻辑
查找对话框的核心逻辑
- 获取当前光标的位置并作为起始点
- 向后(向前)查找目标第一次出现的位置
- 通过目标位置以及目标长度在文本框中进行标记
功能查找的实现
QString类中提供了子串查找的相关函数
indexOf(value, index)
从指定位置向后查找子串的下标位置
lastIndexOf(value, index)
从指定位置向前查找子串的下标位置,向前查找index需要负数。
Qt中光标信息类QTextCursor
所有的光标相关信息都通过这个类描述如:光标位置,文本选择等
查找算法流程图
具体代码实现
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();
}
}
}