QTextEdit /QTextDocument String finden und markieren

Alles rund um die Programmierung mit Qt
Antworten
NAR12
Beiträge: 13
Registriert: 15. Mai 2007 07:03

QTextEdit /QTextDocument String finden und markieren

Beitrag von NAR12 »

Hallo,

ich habe schon eine ganze Weile gesucht, aber nicht so richtig was gefunden. Ich möchte in einem QTextEdit einen String finden.
Als Grundlage habe ich das "Text Finder Example" Beispiel aus der Trolltech Qt4 Doku verwendet. Jetzt möchte ich aber natürlich den gefundenen String markieren, statt die Schrifftfarbe zu ändern.
Habe dafür bei QTextCursor die folgende Funktion gesehen:

Code: Alles auswählen

void QTextCursor::select ( SelectionType selection )
Als SelectionType habe ich "QTextCursor::WordUnderCursor" benutzt, leider ohne Ergebnis. Der Suchstring wird nicht markiert. :(

Hat jemand einen Tipp wie man bei einer Suchfunktion vorgehen kann oder vlt. ein Beispiel? Danke.

MfG
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

QTextDocument hat fast alles an bord....

aus
http://www.qt-apps.org/content/show.php ... tent=59422
primitiv aber geht ....

Code: Alles auswählen


   if (searchups) {
    filer[taindex]->find(findtext,QTextDocument::FindBackward);
    } else {
    filer[taindex]->find(findtext);
    }


.........................
speack português italiano deutsch english castellà qt
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

Lösungsvorschalg 2

Beitrag von s-valve »

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
Antworten