den Inhalt zweier QStrings miteinander vergleichen
den Inhalt zweier QStrings miteinander vergleichen
Hallo,
ich habe vor den Inhalt zweier QStrings miteinander zu vergleichen und die Unterschiede fett hervorzuheben.
Genauer gesagt handelt es sich um komplette Sätze, bei denen die Wörter hervorgehoben werden sollen, in denen sich Unterschiede zu den entsprechenden Wörtern des anderen Satzes befinden.
In der Hilfe werden mir für die Klasse QString mehrere compare-Methoden angeboten, die aber alle nicht so richtig geeignet zu sein scheinen.
Gibt es andere Methoden (auch anderer Klassen) oder Standardalgorithmen die man hierfür benutzen kann?
Danke,
Kai
ich habe vor den Inhalt zweier QStrings miteinander zu vergleichen und die Unterschiede fett hervorzuheben.
Genauer gesagt handelt es sich um komplette Sätze, bei denen die Wörter hervorgehoben werden sollen, in denen sich Unterschiede zu den entsprechenden Wörtern des anderen Satzes befinden.
In der Hilfe werden mir für die Klasse QString mehrere compare-Methoden angeboten, die aber alle nicht so richtig geeignet zu sein scheinen.
Gibt es andere Methoden (auch anderer Klassen) oder Standardalgorithmen die man hierfür benutzen kann?
Danke,
Kai
Du kannst mittels QStringList QString::split ( const QChar & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const deinen Satz in ein QStringList packen. Dann iterierst du über diese Liste und vergleichst die Einzelnen Strings miteinander. Danach alles in einen QString zurück schreiben, welchen du anzeigen willst. Sind sie nicht gleich -> mach es fett!
Grüße
Franz
Grüße
Franz
Das kommt drauf an was du machen willst. Einfach in einem QLabel/QTextEdit anzeigen: QTextEdit::insertHtml() / QLabel::setText() (vorher textFormat anpassen(Rich text)), das fügt Text ein, welchen du mit den html-tags <b>MEIN_STRING</b> fett machst.Kai_002 hat geschrieben:Aber wie mache ich die entsprechenden QStrings genau fett? Muss ich hierfür evtl. die Klasse QFont (QFont::Bold) verwenden?
Beim Zusammenfügen der QStringList-strings einfach bei unterschiedlichem String ein <b> vor das Item und ein </b> danach, und schon hast du es fett
naja, ich hatte vor, den in einem QTreeWidgetItem angezeigten Text (QString) in Abhängigkeit von bestimmeten Bedingungen zu formatieren. Es sollen also lediglich Teile des Textes fett hervorgehoben werden. (weshalb ich bspw. die Methode "setFont ( int column, const QFont & font )" der Klasse QTreeWidgetItem nicht verwenden kann).
Und nun suche ich nach einer Möglichkeit den QString direkt zu formatieren und anschließend dem QTreeWidgetItem über die Methode "setText ( int column, const QString & text )" zuzuweisen.
Wobei, wie schon angesprochen, mein Problem die Formatierung des QStrings ist.
Und nun suche ich nach einer Möglichkeit den QString direkt zu formatieren und anschließend dem QTreeWidgetItem über die Methode "setText ( int column, const QString & text )" zuzuweisen.
Wobei, wie schon angesprochen, mein Problem die Formatierung des QStrings ist.
so, ich habe mich noch ein wenig mit der Qt-Dokumentation befasst. Aber wirklich weiter bin ich eigentlich nicht - zumindest ist immer noch kein Ergebnis sichtbar.
Da die Methode "setTextFormat(Qt::RichText)" der Klasse QTextEdit nur mit Qt3-Unterstützung nutzbar zu sein scheint, habe ich es mit "setAcceptRichText ( true )" versucht. Aber zu sehen ist dummerweise nur der folgende wort-wörtliche String: "normal <b> fett </b> normal"
Was stimmt bei meinem Quellcode nicht? Es kann doch nicht so schwierig sein einen (Teil)String fett darzustellen, oder?
mit this ist das QTreeWidgetItem gemeint, in dem der QString angezeigt werden soll.
Also Danke schonmal wieder im Vorraus,
Kai.
Da die Methode "setTextFormat(Qt::RichText)" der Klasse QTextEdit nur mit Qt3-Unterstützung nutzbar zu sein scheint, habe ich es mit "setAcceptRichText ( true )" versucht. Aber zu sehen ist dummerweise nur der folgende wort-wörtliche String: "normal <b> fett </b> normal"
Was stimmt bei meinem Quellcode nicht? Es kann doch nicht so schwierig sein einen (Teil)String fett darzustellen, oder?
Code: Alles auswählen
//TEST:
QString s1 = "normal";
QString s2 = " <b> fett </b>";
QString s3 = " normal";
QTextEdit edit;
//edit.setTextFormat(Qt::RichText); //ist kein Element der Klasse QTextEdit (nur mit Qt3-Unterstützung)
edit.setAcceptRichText ( true );
edit.insertHtml(s);
QString s = s1 + s2 + s3;
this->setText(0, s); Also Danke schonmal wieder im Vorraus,
Kai.
Ein Beispiel mit QLabels:
Sieht bei mir so aus. Ist natürlich noch arg primitiv, aber es sollte dir zeigen wie ich mir das oben gedacht hatte...
Vielleicht hilfts ja
Grüße
Franz
Code: Alles auswählen
QVBoxLayout *mainLayout = new QVBoxLayout;
QLabel *lb1 = new QLabel("leer", this);
lb1->setTextFormat( Qt::RichText );
lb1->setWordWrap( true );
lb1->setFrameStyle( QFrame::StyledPanel | QFrame::Plain );
QLabel *lb2 = new QLabel("leer", this);
lb2->setTextFormat( Qt::RichText );
lb2->setWordWrap( true );
lb2->setFrameStyle( QFrame::StyledPanel | QFrame::Plain );
mainLayout->addWidget( lb1 );
mainLayout->addWidget( lb2 );
mainLayout->setMargin( 10 );
mainLayout->setSpacing( 10 );
setLayout( mainLayout );
_s1 = QString::fromUtf8("Hallo,<br>ich habe vor den Inhalt zweier QStrings miteinander zu vergleichen und die Unterschiede fett hervorzuheben.<br> Genauer gesagt handelt es sich um komplette Sätze, bei denen die Wörter hervorgehoben werden sollen, in denen sich Unterschiede zu den entsprechenden Wörtern des anderen Satzes befinden.<br><br> In der Hilfe werden mir für die Klasse QString mehrere compare-Methoden angeboten, die aber alle nicht so richtig geeignet zu sein scheinen.<br><br> Gibt es andere Methoden (auch anderer Klassen) oder Standardalgorithmen die man hierfür benutzen kann? <br><br> Danke, <br> Kai");
_s2 = QString::fromUtf8("Hallo,<br>ich habe vor dem Inhalt zweier QString miteinander zu vergleichen und die Unterschiede fedt hervorzuheben.<br> Genauer gesagt handelt es sich um komplette Sätze, bei denen die Worte hervorgehoben werden sollen, in denen sich Unterschiede zu den entsprechenden Wörtern des andren Satzes befinden.<br><br> In der Hilfe werden mir für die Klasse QString mehrere CompareMethoden angeboten, die aber alle nicht so richtig geeignet zu schein seinen.<br><br> Gibt es andere Methoden (auch anderer Klassen) oder Standart-algorithmen die man hierfür benutzen kann? <br><br> Danke, <br> Kai");
QStringList l1 = _s1.split( ' ' );
QStringList l2 = _s2.split( ' ' );
if( l1.size() != l2.size() ) {
qDebug( "Fehler: Strings enthalten nicht gleich viele Worte!" );
lb1->setText( _s1 );
lb2->setText( "String hat nicht die gleiche Anzahl an Worten!" );
}
else {
for( int i=0; i<l1.size(); i++ ) {
if( l1[i] != l2[i] ) {
l2[i].prepend( "<b>" );
l2[i].append( "</b>" );
}
_sf += l2[i];
if( i < l1.size()-1 )
_sf.append( ' ' );
}
lb1->setText( _s1 );
lb2->setText( _sf );
}Vielleicht hilfts ja
Grüße
Franz
Wow, erstmal ein dickes DANKE für deine Mühe.
Das Problem ist aber dummerweise immer noch nicht gelößt: Die Klasse QTreeWidgetItem verfügt im Gegensatz zu QLabel über keine Methode um ihr klar zu machen dass sie RichText interpretieren soll. Das scheint zumindest der Grund dafür zu sein, dass die tags der strings mit ausgegeben werden, anstatt sie zu verarbeiten.
Kann es evtl. sein, dass es für mein Vorhaben keine Lösung gibt
Kai
Das Problem ist aber dummerweise immer noch nicht gelößt: Die Klasse QTreeWidgetItem verfügt im Gegensatz zu QLabel über keine Methode um ihr klar zu machen dass sie RichText interpretieren soll. Das scheint zumindest der Grund dafür zu sein, dass die tags der strings mit ausgegeben werden, anstatt sie zu verarbeiten.
Kann es evtl. sein, dass es für mein Vorhaben keine Lösung gibt
Kai
Du suchst QTextDocument
O.k., ich habe es nochmal mit der Klasse QTextDocument probiert. 2 Varianten meiner Versuche sind hier als Quellcode zu sehen - und beide funktionieren nicht. Bei Version 1 wird "normal fett normal" ausgegeben, und bei Version 2 "normal <b> fett </b> normal".
Mit this ist wieder das QTreeWidgetItem gemeint in dem der String angezeigt werden soll.
Habe ich evtl. irgend eine Kleinigkeit übersehen? Gibt es möglicherweise noch andere Lösungsansätze, einem QTreeWidgetItem formatierte Strings zu übergeben und diese entsprechend anzeigen zu lassen?
Kai
Code: Alles auswählen
//Test Version1:
QString s1 = "normal";
QString s2 = " fett";
QString s3 = " normal";
QTextDocument* textDoc = new QTextDocument( s2, this );
QFont boldFont;
boldFont.setBold(true);
textDoc->setDefaultFont(boldFont);
QString s = s1 + s2 + s3;
this->setText(0, s);
Code: Alles auswählen
//Test Version 2:
QString s11 = "normal";
QString s22 = " <b> fett </b>";
QString s33 = " normal";
QTextDocument* textDocVersion2 = new QTextDocument( s22, this );
textDocVersion2->setHtml(s22);
QString s20 = s11 + s22 + s33;
this->setText(0, s20);Habe ich evtl. irgend eine Kleinigkeit übersehen? Gibt es möglicherweise noch andere Lösungsansätze, einem QTreeWidgetItem formatierte Strings zu übergeben und diese entsprechend anzeigen zu lassen?
Kai
Ok, dann ein paar Hinweise mehr:
Und QItemDelegate
Code: Alles auswählen
void QTextDocument::drawContents ( QPainter * p, const QRectF & rect = QRectF() )
Danke für den weiteren Hinweis.
Auf die Klasse QItemDelegate bin ich inzwischen auch schon gestoßen.
http://lists.trolltech.com/qt4-preview- ... 031-0.html
Also darf ich mich jetzt in die nächste Klasse einarbeiten. Wenn es nicht zu viel ist kannst du mir ja gleich mal ein paar weitere Tipps geben, damit ich nicht erst wieder ewig herumsuche und so langsam auch mal zum Ziel komme.
Danke
Kai
Auf die Klasse QItemDelegate bin ich inzwischen auch schon gestoßen.
http://lists.trolltech.com/qt4-preview- ... 031-0.html
Also darf ich mich jetzt in die nächste Klasse einarbeiten. Wenn es nicht zu viel ist kannst du mir ja gleich mal ein paar weitere Tipps geben, damit ich nicht erst wieder ewig herumsuche und so langsam auch mal zum Ziel komme.
Danke
Kai
Das sind halt alles Fragestellungen die nacheinander aufgetaucht sind. So wie das nun mal ist, wenn man sich schrittweise vorwärtsarbeitet.
Und weil mir die große Programmiererfahrung fehlt und mir sonst niemand diese Fragen beantworten kann, habe ich ebend hier um Hilfe gebeten. Dafür ist dieses Forum unter anderem ja wohl auch da, oder?
Ich konnte bei meiner Problemstellung ja nicht vorhersehen dass das Hauptproblem darin liegen würde in einem QTreeWidgetItem einen formatierten QString darzustellen. Sonst hätte ich die anfängliche Frage auch anders formuliert.
Momentan versuche ich es hinzubekommen das die Klassen QItemDelegate, QTextDocument und QTreeWidgetItem so zusammenspielen, dass mein Vorhaben endlich funktioniert.
Also wer mir dazu Tipps geben kann und möchte, nur her damit. Und wer nicht, naja - der antwortet halt einfach nicht. Ist doch klar.
Kai
Und weil mir die große Programmiererfahrung fehlt und mir sonst niemand diese Fragen beantworten kann, habe ich ebend hier um Hilfe gebeten. Dafür ist dieses Forum unter anderem ja wohl auch da, oder?
Ich konnte bei meiner Problemstellung ja nicht vorhersehen dass das Hauptproblem darin liegen würde in einem QTreeWidgetItem einen formatierten QString darzustellen. Sonst hätte ich die anfängliche Frage auch anders formuliert.
Momentan versuche ich es hinzubekommen das die Klassen QItemDelegate, QTextDocument und QTreeWidgetItem so zusammenspielen, dass mein Vorhaben endlich funktioniert.
Also wer mir dazu Tipps geben kann und möchte, nur her damit. Und wer nicht, naja - der antwortet halt einfach nicht. Ist doch klar.
Kai