Seite 1 von 1

[gelöst] Breite des Texts in QLabel begrenzen

Verfasst: 5. Mai 2010 16:30
von osiris81
Hallo,

Ich habe ein QLabel mit fixer Breite (resp. es erhält durch das Layout eine gewisse Breite) .

In dieses Label wird ein QString geschrieben. Falls der QString nun aber so lang ist, dass er nicht im QLabel Platz hat, wird das Label einfach verbreitert. Dies möchte ich verhindern, indem der String gekürzt wird und "..." angehängt (So wie das bei Listen auch gemacht wird).

Hat jemand eine Ahnung wie ich das hinbekomme?

Verfasst: 5. Mai 2010 16:46
von Nvidia
du überlegst dir wie lange der QString sein darf, also z.b. 20 Zeichen
(pass auf manche Zeichen sind größer "M & W sind relativ lange Zeichen")
Testest mit QString.Size() ob es größer oder kleiner ist.
Wenn er kleinergleich ist fügst du ihn ein
wenn er größer ist
int i = QSize();
QString.replace(20,i,"...")

fertig so würde ich das machen.
nvidia

Verfasst: 5. Mai 2010 16:57
von osiris81
Hallo,

Danke für die Antwort. Wie Du selber schon bemerkt hast, ist das Problem hier, dass nicht alle Zeichen gleich breit sind (es können alle Unicode Zeichen verwendet werden, also kann ich auch nicht davon ausgehen, dass ein "M" am breitesten ist).

Mit QFontMetrics kann ich allerdings herausfinden, wie breit mein QString wird. Nur, falls er zu breit ist, müsste ich nach und nach ein Zeichen entfernen und das ganze nochmals probieren, da müsste es doch etwas effizienteres geben?

Verfasst: 5. Mai 2010 17:30
von Nvidia
Naja entweder du machst das so wie du das beschrieben hast mit einer while schleife.
Was mir noch eingefallen wäre, weiß aber nicht ob das funktioniert.
Du könntest die averageCharWidth () ausrechnen
und dann die berechnest Weite - maximale Weite des QLabels und das Ergebnis durch die average char width teilen und so viele Zeichen entfernen, wie dort rauskommt entfernenen + ein paar für ...
Ich würds mal ausprobieren.
nvidia

Verfasst: 5. Mai 2010 17:31
von Nvidia
ok btw. bei deiner FontMetrik klasse gibst das hier
QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 ) const

If the string text is wider than width, returns an elided version of the string (i.e., a string with "..." in it). Otherwise, returns the original string.

nvidia

Verfasst: 5. Mai 2010 17:54
von osiris81
Super, vielen Dank!

QFontMetrics::elidedText macht genau was ich gebraucht habe!