Qt: Zelleninhalte von Tabelle effizient abkürzen



  • Ich schon wieder, habe noch ein (kleineres) Problem:
    Ich habe einen QTableView mit eigens erstelltem QStyledItemDelegate. Das gibt mir zwar die Macht über die Darstellung des Tableviews, aber ein kleines Problem entsteht:

    Wie kann man den Inhalt einer Zelle abkürzen, wenn die zugehörige Spalte zu schmal wird (Inhalt ist Text)?
    Beispiel wäre "Inhalt einer Zelle" wird zu "Inhalt ein...". Ich habe zwar einen grobschlächtigen Ansatz, wie man den Text verkürzt, aber im Hinblick auf die Performance gibt es hoffentlich besseres:

    //ItemDelegate
    //QPainter painter - zum Zeichnen der Oberfläche
    //QRect rect - umrahmt genau den Inhalt einer Zelle
    //Qt::Alignment align - gibt die Ausrichtung des Inhaltes an
    //QString text - Zelleninhalt, der u.U. abgekürzt werden muss
    
    //boundingRect "simuliert" eine Zeichnung und schaut sich die Größe des Ergebnisses an
    while(painter->boundingRect(rect , align , text).width() > rect.width())
    {
    	if(text.count() <= 4)//für den Fall einer extrem schmalen Spalte
    	{	text = QString(text.at(0)) + "..";
    		break;
    	}
    	text.replace(text.count() - 4 , 4 , QString(".."));//das Herstück der Funktion
    //die letzten 4 Zeichen werden abgeschnitten und zwei Punkte angefügt
    //neuer Schleifendurchlauf folgt
    }
    painter->drawText(rect , align , text);//alles erledigt, Text wird gezeichnet
    

    Es wäre schön, wenn mir jemand Rat geben könnte :).



  • Hat sich erledigt. Lösung des Problems:

    QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 ) const
    

    In der paint-Funktion erstellt durch

    painter->fontMetrics()
    

    kürzt es einen Text so zusammen, wie es nötig ist. Und vermutlich tut es das deutlich effizienter, als ich es mit einer selbstgeschusterten Funktion könnte.


Log in to reply