Hier eine andere Lösung mittels QTextEdit->document().
aufrufende Funktion:
Code: Alles auswählen
int options = 0;
if ( bwd == true )
options |= QTextDocument::FindBackward;
if ( FRD_checkBox_match->isChecked() )
options |= QTextDocument::FindWholeWords;
if ( FRD_checkBox_caseSensitive->isChecked() )
options |= QTextDocument::FindCaseSensitively;
ok = m_PageCtrl->find(activeWindow, FRD_lineEdit_findString->text(), FRD_lineEdit_replaceString->text(), (QTextDocument::FindFlags)options);
ausführende Funktion:
Code: Alles auswählen
bool PageCtrl::find(QString window, QString Str, QString rStr, QTextDocument::FindFlags options)
{ //find given string
if (TabCtrl->count() < 1)
return(false); //return if not tab exists
QTextEdit *TE = 0; //create a TextEdit pointer
if (window == "Dec")
{ //get TE from Declarations and reset cursor of Instructions
TE = TabCtrl->currentWidget()->findChild<QTextEdit*>("TE1");
TabCtrl->currentWidget()->findChild<QTextEdit*>("TE2")->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor);
}
if (window == "Ins")
{ //get TE from Instructions and reset cursor of Declarations
TE = TabCtrl->currentWidget()->findChild<QTextEdit*>("TE2");
TabCtrl->currentWidget()->findChild<QTextEdit*>("TE1")->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor);
}
QTextDocument *doc = TE->document(); //get pointer to current document
QTextCursor c = TE->textCursor(); //get cursor to current text
if (c.atStart() == true)
emit cursorAtStartPos();
//find string
QTextCursor newCursor = c;
newCursor = doc->find(Str, c, options);
if (newCursor.isNull())
newCursor = c; //if not set old to new cursor
else
{
TE->setTextCursor(newCursor); //if yes move text cursor to new cursor
if (!rStr.isEmpty())
{
newCursor.removeSelectedText();
newCursor.insertText(rStr);
}
}
//test if the string could be found after actual position
QTextCursor newCursor2 = newCursor;
newCursor2 = doc->find(Str, newCursor, options);
if (newCursor2.isNull())
return(false); //if not return with=0
else
return(true); //if yes return with=1
}
Kurze Erklärung: Die Funktion stammt auf meinem SPS Editor. Es wird ein Dialog aufgerufen, welcher eine Suchen & Ersetzen Funktion integriert.
Da ich pro TabWidget-Seite zwei TextEdits habe kommt in den Funktionen ein extra Auswahlstring vor, welcher an anderer Stelle ermittelt wird.
Die Suchfunktion sucht über das Dokument und setzt den Cursor falls der Suchstring gefunden wurde. Bei der nächsten Suche wird ab der neuen Cursorposition gesucht. Damit meine Suchfunktion über beide textEdiuts rotiert habe ich eine weitere kleine Suche für ein nächstes Vorkommen hinzugefügt. Gibt es kein nächstes Vorkommen wird "false" zurück gegeben, was die TextEdit-Auswahl beeinflusst (im nächsten Suchdurchlauf wird dann auf das jeweils andere TextEdit umgeschaltet.)
Das emit ist nur für einen weiteren SLOT in meinem Programm, unwichtig für die Suchfunktion ansich.
Interessant ist nur, dass TExtEdit->find(.. und TextEdit->document()->find(.. jeweils den gefundenen Text markieren. Bei 1. gibt es nur ein True zurück. Bei 2. hat man mit dem rückgegebenen Cursor etwas mehr Spielraum.
Gruß,
M