Search code examples
c++qtqtexteditqregexpqtextcursor

Changing text in a QTextEdit


Hi I am trying to make a function to scan through a QTextEdit, search for email addresses and phone numbers and change them to bold. When I run it it crashes my program with error "QTextCursor::setPosition: Position '-1' out of range", here is the code:

void MakeDisplay::processDoc(){
    QString doc = text->toPlainText();
    QTextCursor cursor = text->textCursor();
    QTextCharFormat format;
    format.setFontWeight(75);
    QRegExp emails("*.@.*");
    QRegExp phoneNums
    ("(\\d{3}-\\d{3}-\\d{4})(\\d{3}-\\d{7})(\\d{10})(\\(\\d{3}\\)\\d{3}-\\d{4})(\\(\\d{3}\\)\\d{7})");
    int i, j;
    i = 0;
    j = 0;
    while (!cursor.atEnd() || (i != doc.size())){
        i = doc.indexOf(emails);
        j = doc.indexOf(phoneNums);
        cursor.setPosition(i,QTextCursor::MoveAnchor);
        cursor.setPosition(i, QTextCursor::KeepAnchor);
        cursor.mergeCharFormat(format);
        cursor.setPosition(j,QTextCursor::MoveAnchor);
        cursor.setPosition(j, QTextCursor::KeepAnchor);
        cursor.mergeCharFormat(format);
        i++;
        j++;
    }

}

Solution

  • You need to search until nothing more interesting is found:

    void MakeDisplay::processDoc(){
        QString doc = text->toPlainText();
        QTextCursor cursor = text->textCursor();
        QTextCharFormat format;
        format.setFontWeight(75);
        QRegExp emails("*.@.*");
        QRegExp phoneNums
        ("(\\d{3}-\\d{3}-\\d{4})(\\d{3}-\\d{7})(\\d{10})(\\(\\d{3}\\)\\d{3}-\\d{4})(\\(\\d{3}\\)\\d{7})");
        int i, j;
        i = 0;
        j = 0;
        while (!cursor.atEnd()&& (i!=-1||j!=-1))
        {
            if(i!=-1)
            {
               i = doc.indexOf(emails);
               if(i!=-1)
               {       
                  cursor.setPosition(i,QTextCursor::MoveAnchor);
                  cursor.setPosition(i, QTextCursor::KeepAnchor);
                  cursor.mergeCharFormat(format);
                  ++i;
               }
            }
            if(j!=-1)
            {
               j = doc.indexOf(phoneNums);
               if(j!=-1)
               {
                  cursor.setPosition(j,QTextCursor::MoveAnchor);
                  cursor.setPosition(j, QTextCursor::KeepAnchor);
                  cursor.mergeCharFormat(format);
                  ++j;
               }
        }
    }